私のアプリからカメラを起動して写真を撮っています。ギャラリーでも利用可能になります。最新の写真を取得するには
よくある問題は、写真のパスを知ることです。提案された解決策は以下のとおりです。
- パスを自分で保存し、ギャラリーの最後の撮影した写真からパスを取る
EXTRA_OUTPUT
- を使用しての上にそれを送信します。
解決策1 isn't reliable。
私はこのコードで、溶液2作品を作るためにしようとしている:
public static String getTakenPhotoPath(Context context) {
try {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, null);
int column_index_data = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToLast();
return cursor.getString(column_index_data);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
これは、最新の写真のパスを返しません。それは前のものを返します。あなたがカメラを開いているとき、あなたはこのような将来の撮影した画像のためにあなた自身の好みの場所を渡すことができます:あなたはそれはこのように行うことができます
private void addToGallery(Uri urlType, String path) {
if (!Strings.isNullOrEmpty(path)) {
ContentValues values = new ContentValues();
// Add the date meta data to ensure the image is added at the front of the gallery
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.MediaColumns.DATA, path);
getContentResolver().insert(urlType, values);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(new File(path));
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
}
解決策2は、解決策1よりも信頼性が低い。カメラアプリがイメージのMediaStoreインデックスを持っている必要はありません。タイムリーな方法でそれを行うだけです。推奨される 'ACTION_IMAGE_CAPTURE'トリアージについては、[この回答](https://stackoverflow.com/a/41945392/115145)を参照してください。 – CommonsWare
解決策1は信頼できるものです。私はそれが失敗するのを見たことがない。 – greenapps
@greenapps:Stack Overflowでは、さまざまなカメラアプリの問題を報告している皆さんがここにいませんでした。 'ACTION_IMAGE_CAPTURE'は単純にはあまりテストされておらず、' ACTION_IMAGE_CAPTURE'がどのように動作するかについてのドキュメントを読まない開発者もいます。詳細については、[2015年のこの噂](https://commonsware.com/blog/2015/06/08/action-image-capture-fallacy.html)を参照してください。 – CommonsWare