英文:
how can i get date_taken value of photo in media store?
问题
该代码分析照片的情感,方法是获取手机的MediaStore中的所有照片,并将其中包含脸部的照片发送到我们的模型。然而,在每次启动时,我们不需要再次查看整个MediaStore,只需查看新增加的照片。
dateTaken
始终返回 "0",而 imagePath
返回有值。
imagePath
的值为真,但 dateTaken
的值为假。
这段代码用于获取照片列表:
public static void listOfImages(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
long lastPhotoDate = sharedPreferences.getLong("last_photo_date", -1);
String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN };
String selection = null;
String[] selectionArgs = null;
String sortOrder = MediaStore.Images.Media.DATE_TAKEN + " DESC";
if (lastPhotoDate != -1){
selection = MediaStore.Images.Media.DATE_TAKEN + " >?";
selectionArgs = new String[] { String.valueOf(lastPhotoDate) };
}
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
if (cursor != null && cursor.moveToFirst()) {
do {
String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN));
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("last_photo_date", dateTaken);
editor.apply();
final Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
FaceDetector faceDetector = new FaceDetector.Builder(context.getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> sparseArray = faceDetector.detect(frame);
for (int i = 0; i < sparseArray.size(); i++) {
Face face = sparseArray.valueAt(i);
Bitmap faceBitmap = Bitmap createBitmap(
myBitmap,
(int) face.getPosition().x,
(int) Math.abs(face.getPosition().y),
(int) face.getWidth(),
(int) face.getHeight());
classifyEmotions(faceBitmap, context, imagePath);
}
} while (cursor.moveToNext());
cursor.close();
}
}
此代码块用于获取每张照片的 dateTaken
,但似乎它对于每张照片都返回零。
英文:
The app analyzes emotion by taking all the photos in the phone's MediaStore and sending the photos containing the face(s) in the loop to our model. However, instead of looking at the whole MediaStore again at each launch, we only need to look at the newly added photos.
dateTaken always returns "0" while imagePath returns value.
imagePath's value is true but dateTaken's value false.
public static void listOfImages(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
long lastPhotoDate = sharedPreferences.getLong("last_photo_date", -1);
String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN };
String selection = null;
String[] selectionArgs = null;
String sortOrder = MediaStore.Images.Media.DATE_TAKEN + " DESC";
if (lastPhotoDate != -1){
selection = MediaStore.Images.Media.DATE_TAKEN + ">?";
selectionArgs = new String[] { String.valueOf(lastPhotoDate) };
}
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
if (cursor != null && cursor.moveToFirst()) {
do {
String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN));
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("last_photo_date", dateTaken);
editor.apply();
final Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
FaceDetector faceDetector = new FaceDetector.Builder(context.getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> sparseArray = faceDetector.detect(frame);
for (int i = 0; i < sparseArray.size(); i++) {
Face face = sparseArray.valueAt(i);
Bitmap faceBitmap = Bitmap.createBitmap(
myBitmap,
(int) face.getPosition().x,
(int) Math.abs(face.getPosition().y),
(int) face.getWidth(),
(int) face.getHeight());
classifyEmotions(faceBitmap, context, imagePath);
}
} while (cursor.moveToNext());
cursor.close();
}
}
this code block returns zero for each photo:
long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN));
答案1
得分: 0
以下是翻译好的代码部分:
public static void listOfImages(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
long lastPhotoDate = sharedPreferences.getLong("last_photo_date", -1);
String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED };
String selection = null;
String[] selectionArgs = null;
String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
if (lastPhotoDate != -1){
selection = MediaStore.Images.Media.DATE_ADDED + " >?";
selectionArgs = new String[] { String.valueOf(lastPhotoDate) };
}
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
if (cursor != null && cursor.moveToFirst()) {
do {
String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("last_photo_date", dateTaken);
editor.apply();
final Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
FaceDetector faceDetector = new FaceDetector.Builder(context.getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> sparseArray = faceDetector.detect(frame);
for (int i = 0; i < sparseArray.size(); i++) {
Face face = sparseArray.valueAt(i);
Bitmap faceBitmap = Bitmap.createBitmap(
myBitmap,
(int) face.getPosition().x,
(int) Math.abs(face.getPosition().y),
(int) face.getWidth(),
(int) face.getHeight());
classifyEmotions(faceBitmap, context, imagePath);
}
} while (cursor.moveToNext());
cursor.close();
}
}
解决了访问MediaStore.Images.Media.DATE_TAKEN
属性的问题,改为使用MediaStore.Images.Media.DATE_ADDED
属性,现在该代码根据我们的目的正常工作。
英文:
public static void listOfImages(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
long lastPhotoDate = sharedPreferences.getLong("last_photo_date", -1);
String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED };
String selection = null;
String[] selectionArgs = null;
String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
if (lastPhotoDate != -1){
selection = MediaStore.Images.Media.DATE_ADDED + ">?";
selectionArgs = new String[] { String.valueOf(lastPhotoDate) };
}
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
if (cursor != null && cursor.moveToFirst()) {
do {
String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
long dateTaken = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("last_photo_date", dateTaken);
editor.apply();
final Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
FaceDetector faceDetector = new FaceDetector.Builder(context.getApplicationContext())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> sparseArray = faceDetector.detect(frame);
for (int i = 0; i < sparseArray.size(); i++) {
Face face = sparseArray.valueAt(i);
Bitmap faceBitmap = Bitmap.createBitmap(
myBitmap,
(int) face.getPosition().x,
(int) Math.abs(face.getPosition().y),
(int) face.getWidth(),
(int) face.getHeight());
classifyEmotions(faceBitmap, context, imagePath);
}
} while (cursor.moveToNext());
cursor.close();
}
}
We were experiencing an issue because we couldn't access the MediaStore.Images.Media.DATE_TAKEN property of MesiaStore. I resolved the issue by using the DATE_ADDED property of MesiaStore instead. Now this code is working properly according to our purpose.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论