How can I save temporary pictures with camera in A

2019-07-13 13:03发布

问题:

While trying to take a picture from the camera, and saving it on the cache folder of the app, I get no visible result. App doesn't crash, but on the LogCat I got this message once I try to set an ImageView src field to the URI of the file just taken:

09-17 14:03:32.200: I/System.out(5104): Not a DRM File, opening notmally
09-17 14:03:32.200: I/System.out(5104): buffer returned 
09-17 14:03:32.205: D/skia(5104): --- SkImageDecoder::Factory returned null
09-17 14:03:32.205: I/System.out(5104): resolveUri failed on bad bitmap uri: /data/data/com.example.me/cache/prefix1708798995.jpg

Code is quite simple, actually:

File tempFile;

try {
    tempFile = File.createTempFile("prefix", ".jpg");
} catch (IOException e) {
    e.printStackTrace();
    AppUtil.showErrorToUser(getApplicationContext(), getResources().getString(R.string.ERROR_upload));
    return;
}

mCameraImage = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);

And, in the onActivityResult():

mIvAttach.setImageURI(Uri.parse(mBodyLocalUri));

I'm also very disappointed that I can't verify if pictures are actually taken, since I can't access /data/data/myapp folder (my GS3 is not rooted, and I still care about my warranty), therefore I'm not able to tell where the problem's very origin is.

回答1:

Third-party camera apps have no rights to write to your internal storage, including getCacheDir() (which somehow createTempFile() is using, though it's not clear to me exactly how).

I'm also very disappointed that I can't verify if pictures are actually taken, since I can't access /data/data/myapp folder (my GS3 is not rooted, and I still care about my warranty), therefore I'm not able to tell where the problem's very origin is.

First, you can, using adb run-as. Second, this is another manifestation of the same problem: just as DDMS cannot access internal storage, neither can the third-party app.

Use getExternalCacheDir() instead, to get a cache location on external storage, which a third-party camera app can try to write to. Note, though, that not all third-party camera apps will necessarily write to your requested location, due to bugs/limitations in those apps.