android4.4,6.0,7.0系统调用相机拍照通配及获取相册图片

来源:互联网 发布:淘宝社区论坛 编辑:程序博客网 时间:2024/05/16 11:55
2按钮的简单布局就不写了,关键代码:
private String rootUrl = null;//根目录private String curFormatDateStr = null;private String filePath;//文件路径
private static final int CAMERA_IMAGE_CODE = 2;
private static final int LOCAL_IMAGE_CODE = 1;
private static final String IMAGE_TYPE = "image/*";

拍照按钮点击事件:
case R.id.ll_photograph:    //拍照获取    checkCameraPermission();//检查相机权限    break;
相册获取图片点击事件:
case R.id.ll_add_from_album:    //从相册中取    Intent intent = new Intent();     /* 开启Pictures画面Type设定为image */    intent.setType(IMAGE_TYPE);    /* 使用Intent.ACTION_GET_CONTENT这个Action */    intent.setAction(Intent.ACTION_GET_CONTENT);    /* 取得相片后返回本画面 */    startActivityForResult(intent, LOCAL_IMAGE_CODE);    break;

/** * TODO 检查相机权限 */private void checkCameraPermission() {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_ACCESS_PERMISSION);    } else {        checkWriteStoragePermission();    }}/** * TODO 检查写入SDK权限 */private void checkWriteStoragePermission() {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE_PERMISSION);    } else {        startCamera();    }}
/** * TODO 开启相机 */
private void startCamera() {
    rootUrl = Environment.getExternalStorageDirectory().getPath();
    curFormatDateStr = TimeUtil.getImageNameTime(Calendar.getInstance().getTime());
filePath = rootUrl + "/golf/camera/" + "IMG_" + curFormatDateStr + ".png"; File file = new File(filePath); if (!file.exists()) { File dirs = new File(file.getParent()); if (!dirs.exists()) { dirs.mkdirs(); } } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filePath))); startActivityForResult(intent, CAMERA_IMAGE_CODE);}
//
  @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {            String url = "";            if (requestCode == LOCAL_IMAGE_CODE) {                Uri uri = data.getData();//此处或取到uri,就可以做相应的拓展处理                Log.i(TAG, "相册uri是:" + uri.toString());                url =ImageUtil.getRealFilePath(this, uri);//获取图片真实路径
            //此处为页面数据返回:给另一页面返回图片路径
Log.i(TAG, "本地相册url是:" + url); data.putExtra("url", url); this.setResult(RESULT_OK, data); finish(); } else if (requestCode == CAMERA_IMAGE_CODE) { Log.i(TAG, "相机拍照的url是:" + filePath);
uri = Uri.parse(filePath);//此处或取到uri,就可以做相应的拓展处理,发送图片,显示图片等操作
//此处为页面数据返回:给另一页面返回图片路径
Intent intent = new Intent(); intent.putExtra("url", filePath); this.setResult(RESULT_OK, intent); finish(); } } }
/** * TODO 根据图片uri获取图片的url * * @param context * @param uri * @return */public static String getRealFilePath(final Context context, final Uri uri) {    if (null == uri) return null;    final String scheme = uri.getScheme();    String data = null;    if (scheme == null)        data = uri.getPath();    else if (ContentResolver.SCHEME_FILE.equals(scheme)) {        data = uri.getPath();    } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {        Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);        if (null != cursor) {            if (cursor.moveToFirst()) {                int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);                if (index > -1) {                    data = cursor.getString(index);                }            }            cursor.close();        }    }    return data;}

以上方法在7.0系统中会报错:
解决问题:在
onCreate(@Nullable Bundle savedInstanceState)方法中加入以下代码ok:
// android 7.0系统解决拍照的问题StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();


阅读全文
0 0
原创粉丝点击