私は学校向けのアプリを書いていますが、その最大の部分の1つは写真を撮ることです。それらを内部ストレージに保存するだけで完璧であり、アンインストールプロセス中に自動的に削除されるという結論に達しました。
私はいくつかのコードサンプルに出くわし、それを行う簡単な方法がないことを証明しました(そして、外部メモリに画像を保存することも簡単なことであることに気づきました)。しかし、私はなんとかその質問を見つけることができました:内部メモリ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に更新したばかりで、問題は引き続き発生します。
もう1つは、外部ストレージに保存されたファイルが削除されないことです。file.delete()は常にfalseを返します。SDカードを持っていないのは私の問題ですか?(つまり、電話にスロットがありますが、16GBの内部ストレージしかありません)。ファイルは、なんらかの方法でエミュレートされたかのように/ mnt / sdcard /Pictures/フォルダに保存されます。
質問の前に: android.permission.READ_EXTERNAL_STORAGEとandroid.permission.WRITE_EXTERNAL_STORAGEの両方の権限が設定されています。
Environment.getExternalStoragePublicDirectoryをgetCacheDir、getExternalCacheDirに置き換えてみましたが、どちらも機能しませんでした。
私はAndroid4.0.4(ストック)を搭載したSamsungGalaxySIIですべてのものをテストしています