第一步 写方法调用相机相册
现在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"); }