デバイスのカメラを使用して写真を撮ることができるアプリケーションがあります。EXTRA_OUTPUT を割り当てずに ACTION_IMAGE_CAPTURE インテントを開始し、デフォルトの場所に作成されたファイルを file.renameTo を使用して独自のカスタムの場所に移動します。私のコードは次のようなものです:
/* Start camera activity without EXTRA_OUTPUT */
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, _REQUESTCODE_ATTACH_CAMERA);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch(requestCode) {
case _REQUESTCODE_ATTACH_CAMERA:
/* Get path to most recently added image */
final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };
final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
String fullPath = "";
if(imageCursor.moveToFirst()){
fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
imageCursor.close();
}
File f = Environment.getExternalStorageDirectory();
f = new File(f.getAbsolutePath() + File.separator + "DCIM" + File.separator + MY_APP_NAME;
if(!f.exists()) {
f.mkdirs();
}
/* Create new file based on name of most recently created image */
File oldFile = new File(fullPath);
String newPath = f.getAbsolutePath() + File.separator + oldFile.getName() ;
/* Move file with renameTo */
oldFile.renameTo(new File(newPath));
break;
...
}
}
}
これらはすべて非常にうまく機能しますが、奇妙なことが 1 つあります。私のアプリには、電話のギャラリーから既存の画像を選択できる別のボタンがあります。そのコードは次のようになります。
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("image/*");
activity.startActivityForResult(galleryIntent, _REQUESTCODE_ATTACH_GALLERY);
これも機能しますが、上記のコードを使用してカメラで写真を撮り、ギャラリーから別の画像を選択しようとすると、ギャラリーに空白の「壊れたリンク」タイプのアイテムがあり、コンテンツが含まれておらず、選択できません。 . これらは、renameTo を使用して撮影および移動された写真に対応しているようです。ファイル名を LogCat に投稿するコードを onActivityResult に入れると、ログに記録される名前は、対応する以前に移動されたファイルの名前と同じになります。File オブジェクトを作成しようとしたり、何らかの方法でそのファイル名にアクセスしようとすると、null オブジェクトが生成され、強制的に閉じられます。
奇妙な点は、これらの「壊れたリンク」ファイルの証拠が Eclipse DDMS にも、ルート ブラウザーを使用している場合の電話自体にもなく、SD カードを再マウントすると消えることです。
カメラでキャプチャした後に画像を移動する理由は、携帯電話のギャラリー ストレージが不要な画像でいっぱいになるのを避けるためです。これらの空の「壊れたリンク」タイプのファイルはストレージ スペースを占有していないように見えますが、ギャラリーをブラウズしようとするエンド ユーザーにとっては非常に煩わしいものです。ここで何が起こっているのか、またはこの問題を解決する方法について何か考えがある人はいますか?
編集: これはギャラリーがどのように見えるかを示す写真で、「壊れたリンク」タイプの画像が表示されています. これらのいずれかが私のアプリを使用して撮影されたすべての写真に表示され、SD カードを再マウントするとすべて消えます。