第一步 寫方法呼叫相機相簿
現在u3d中寫好呼叫相機和相簿的方法(呼叫的同一個方法,“xj”這個是用來區分呼叫的型別的,path是你要存放的路徑)
path = Application.persistentDataPath Application.persistentDataPath這個路徑是用來存放一些臨時資料的
第二步 android 呼叫相機
public void TakePhoto(String arg,String path){
path1=path;
if(arg.equals("xj"))
{
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.png")));
startActivityForResult(intent, PHOTOHRAPH);
} else{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// File imagePath = new File(mContext.getFilesDir(), "camera_photos");
File imagePath = new File(Environment.getExternalStorageDirectory(), "temp.png");
Uri uri = FileProvider.getUriForFile(mContext,"com.elfgame.superpoker.fileprovider",imagePath);
HeadFile=imagePath;
Log.i(uri.toString(), "頭像111111");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION );
startActivityForResult(intent, PHOTOHRAPH);
}
}else
{
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
startActivityForResult(intent, PHOTOZOOM);
}
}
如果你的手機是android 7.0 以上的就必須這麼處理。(這個自行百度,處理android7.0許可權)
第三步 處理拍照完成
拍照完成後會呼叫這個方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == NONE)
return;
if (requestCode == PHOTOHRAPH) {
Log.i("照片流程1","11111");
File picture = new File(Environment.getExternalStorageDirectory(), "temp.png");
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
startPhotoZoom(Uri.fromFile(picture));
}else{
Uri uri = FileProvider.getUriForFile(mContext,"com.elfgame.superpoker.fileprovider",picture);
startPhotoZoom(uri);
}
}
if (data == null)
return;
if (requestCode == PHOTOZOOM) {
startPhotoZoom(data.getData());
}
if (requestCode == PHOTORESOULT) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
photo =getRoundedCornerBitmap(photo);
//imageView.setImageBitmap(photo);
try {
SaveBitmap(photo);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 80);
intent.putExtra("outputY", 80);
intent.putExtra("return-data", true);
Log.e("1111", "11111111path");
startActivityForResult(intent, PHOTORESOULT);
}
把圖片處理成圓形(如果不需要可以忽略這一步)
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
if (bitmap== null){
return null;
}
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
/* 去鋸齒 */
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
// 保證是方形,並且從中心畫
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int w;
int deltaX = 0;
int deltaY = 0;
if (width <= height) {
w = width;
deltaY = height - w;
} else {
w = height;
deltaX = width - w;
}
final Rect rect = new Rect(deltaX, deltaY, w, w);
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
// 圓形,所有隻用一個
int radius = (int) (Math.sqrt(w * w * 2.0d) / 2);
canvas.drawRoundRect(rectF, radius, radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
儲存圖片並返回u3d
public void SaveBitmap(Bitmap bitmap) throws IOException {
FileOutputStream fOut = null;
String path = path1;
Log.e(path, "11111111path");
try {
File destDir = new File(path);
if (!destDir.exists())
{
destDir.mkdirs();
}
fOut = new FileOutputStream(path + "/" + FILE_NAME) ;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.PNG, 50, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
Log.e(path + "/" + FILE_NAME, "33333333path");
mUnityPlayer.UnitySendMessage("Main","GetPho",FILE_NAME);
Log.e(path, "44444444path");
}