3

在尝试从相机拍照并将其保存在应用程序的缓存文件夹中时,我没有得到任何可见的结果。应用程序不会崩溃,但是在 LogCat 上,一旦我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI,就会收到此消息:

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

代码其实很简单:

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);

并且,在onActivityResult()

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

我也失望,我无法验证是否真的拍摄了照片,因为我无法访问/data/data/myapp文件夹(我的 GS3 没有 root,我仍然关心我的保修),因此我不知道在哪里问题的根源是。

4

1 回答 1

4

第三方相机应用程序无权写入您的内部存储,包括getCacheDir()(以某种方式createTempFile()正在使用,尽管我不清楚具体如何使用)。

我也很失望,因为我无法访问 /data/data/myapp 文件夹(我的 GS3 没有植根,我仍然关心我的保修),所以我无法验证照片是否真的被拍摄,因此我我无法说出问题的根源在哪里。

首先,您可以使用adb run-as. 其次,这是同一个问题的另一种表现:就像 DDMS 不能访问内部存储一样,第三方应用程序也不能。

改为使用getExternalCacheDir()在外部存储上获取缓存位置,第三方相机应用程序可以尝试写入该位置。但请注意,由于这些应用程序中的错误/限制,并非所有第三方相机应用程序都一定会写入您请求的位置。

于 2013-09-17T12:28:24.210 回答