选择图片时Android文件.canRead()= false,但拍摄照片时没有

时间:2015-09-16 19:30:55

标签: android image

我在"上传图片上有2个按钮"用户将图像上传到Web服务的页面。一种用于选择设备上的图像,另一种用于使用相机拍摄照片。

thisFragment.findViewById(R.id.btnChooseImage).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Assert.assertNotNull("file uri not null before firing intent", mFileUri);
            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            //this is the file that the camera app will write to
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
            startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        }
    });

    thisFragment.findViewById(R.id.btnTakePhoto).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Assert.assertNotNull("file uri not null before firing intent", mFileUri);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //this is the file that the camera app will write to
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
            startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        }
    });

btnTakePhoto在我拍摄照片时加载带有结果的ImageView时效果很好,但是当我使用另一个按钮选择照片时,imageView是空白的......

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if(data != null) {
            if(data.getData() != null) {
                Log.v(LOG_TAG, "intent data: " + data.getData().toString());
            }
            if(data.getAction() != null) {
                Log.v(LOG_TAG, "intent action: " + data.getAction().toString());
            }
            if(data.getExtras() != null) {
                Log.v(LOG_TAG, "intent extras: " + data.getExtras().toString());
            }
        }

        Assert.assertNotNull("file uri in onActivityResult", mFileUri);
        Log.v(LOG_TAG, "stored file name is " + mFileUri.toString());
        File file = getFileFromUri();
        if(file != null) {
            Bitmap bm = decodeSampledBitmapFromFile(file, 500, 500);
            imgMain.setImageBitmap(bm);
        }else{
            imgMain.setImageBitmap(null);
        }
    } else {
        parentActivity.finish();
    }

}

    private File getFileFromUri() {
    if(mFileUri != null) {
        try {
            URI uri;
            if(mFileUri.toString().startsWith("file://")){
                //normal path
                uri = URI.create(mFileUri.toString());
            } else {
                //support path
                uri = URI.create("file://" + mFileUri.toString());
            }
            File file = new File(uri);
            if (file != null) {
                //if (file.canRead()) {
                    return file;
                //}
            }
        } catch (Exception e) {
            return null;
        }
    }
    return null;
}

我注意到当我点击这行代码时:

if (file.canRead()) {
                    return file;
                }
我拍照时

file.canRead()为TRUE,但选择图片时为false。当我走过去看看" uri"的价值时变量,这里是:

file:///storage/emulated/0/Pictures/IMG_20150916_141518.jpg - this works

file:///storage/emulated/0/Pictures/IMG_20150916_141854.jpg - 这不起作用

知道这里发生了什么?

UPDATE:尝试使用ContentResolver中的InputStream方法,但仍无法显示位图:

Uri selectedImage = data.getData();
        InputStream imageStream = null;
        try {
             imageStream = parentActivity.getContentResolver().openInputStream(selectedImage);
        }catch (FileNotFoundException e){
            Log.v(LOG_TAG, "cant load file " + mFileUri.toString());
        }

       Bitmap bm = BitmapFactory.decodeStream(imageStream);
        imgMain.setImageBitmap(bm);

0 个答案:

没有答案