我正在为学校编写一个应用程序,其中最大的部分之一就是拍照。我得出的结论是,如果我可以将它们保存在内部存储中,那将是完美的,这样它们就会在卸载过程中被自动删除。
我遇到了几个代码示例,证明我没有简单的方法来做到这一点(我意识到将图像保存在外部存储器上也是小菜一碟)。但是,我设法找到了这个问题:Trouble writing internal memory android并想出了类似的东西。经过一段时间的测试,我遇到了“无法恢复活动”异常,但幸运的是我找到了一个调整:android 中来自相机意图问题的图像
现在我的代码如下所示:
private void dispatchTakePictureIntent(int actionCode) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), FITPAL_TEMP_PICTURE_NAME);
Uri outputFileUri = Uri.fromFile(file);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(takePictureIntent, actionCode);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case ACTION_TAKE_PHOTO_B: {
if (resultCode == RESULT_OK) {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), FITPAL_TEMP_PICTURE_NAME);
Bitmap picture = BitmapFactory.decodeFile(file.getAbsolutePath());
if (picture == null) {
showShortToast(R.string.problem_with_taking_a_picture);
return;
}
File dir = getDir(Environment.DIRECTORY_PICTURES, Context.MODE_PRIVATE);
File internalFile = null;
internalFile = new File(dir, generateUniqueFilename());
internalFile.setReadable(true);
internalFile.setWritable(true);
internalFile.setExecutable(true);
try {
internalFile.createNewFile();
FileOutputStream fos = new FileOutputStream(internalFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
picture.compress(Bitmap.CompressFormat.JPEG, JPEG_FILE_QUALITY, bos);
bos.flush();
bos.close();
String filePath = internalFile.getAbsolutePath();
pictureFilePaths.add(filePath);
addPictureThumbnail(filePath);
Log.d("mounted?", "" + Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED));
Log.d("delete test 23123123", "" + file.getAbsolutePath() + " " + file.delete());
} catch (Exception e) {
Log.e("eks", e.getMessage());
showShortToast(R.string.problem_with_taking_a_picture);
}
}
else if (resultCode == RESULT_CANCELED) {
showShortToast(R.string.taking_picture_has_been_cancelled);
}
break;
}
default:
break;
}
}
基本上我要做的是将图片写入外部存储并将其移动到内部存储。它适用于 80% 的情况,但不是 100%,因为它有时只是“重置”活动 - 新的空布局显示出来,就好像它刚刚创建一样。我不知道发生了什么。我意识到在这种情况下 onSaveInstanceState 和 onRestoreInstanceState 都会触发,我不知道为什么(一路上没有抛出异常)。
调用所有代码的活动正在扩展 FragmentActivity。我已经阅读了一些错误可能会导致旧版本的 Android 支持包中出现这种情况,但我刚刚将其更新到版本 13,问题仍然存在。
另一件事是保存在外部存储上的文件不会删除 - file.delete() 总是返回false。是我没有sdcard的问题吗?(我的意思是我的手机中有一个插槽,但我只有 16GB 的内部存储空间)。该文件被保存到 /mnt/sdcard/Pictures/ 文件夹,就好像它以某种方式被模拟一样。
提前提出问题:我同时设置了android.permission.READ_EXTERNAL_STORAGE和android.permission.WRITE_EXTERNAL_STORAGE权限:
我尝试用 getCacheDir , getExternalCacheDir 替换Environment.getExternalStoragePublicDirectory ,但它们都没有工作。
我正在使用 Android 4.0.4(库存)在我的三星 Galaxy SII 上测试所有这些东西