指定したディレクトリのjpegファイルのファイル名と撮影年月日の一覧をListViewで表示するandroidアプリ(android studio Bumblebee、 javaで)を作っています。
Activity Result API、ストレージアクセスフレームワークを利用してファイル名は取得できるのですが、ExifInterface での撮影年月日が取得できません。タグが見当たらないという意味か null が返されます。
jpegファイルのExifに撮影年月日(TAG_DATETIME_ORIGINAL)が存在しているのは確認しています。
inputStream が null かと思い確認したところ notNull でした。
私のコードのどこに問題があるのかご指摘いただければと思います。
ご助言よろしくお願いいたします。
java
1public class SortFragment extends Fragment { 2 3 private FragmentSortBinding binding; 4 static List<String> dataList = new ArrayList<String>(); 5 static ArrayAdapter<String> adapter; 6 7 final Context context = getContext(); 8 9 ActivityResultLauncher<Intent> getFolderLauncher = registerForActivityResult( 10 new ActivityResultContracts.StartActivityForResult(), 11 new ActivityResultCallback<ActivityResult>() { 12 @Override 13 public void onActivityResult(ActivityResult result) { 14 // 結果を取得した時の処理を定義 15 if (result.getResultCode() == RESULT_OK) { 16 Intent data = result.getData(); 17 Uri uri = data.getData(); // 選択ディレクトリuri 18 19 // ファイルアクセスのためのオブジェクトを取得する 20 DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri); 21 final @NonNull DocumentFile[] listFiles = documentFile.listFiles(); 22 23 String fileName = "", exifData = ""; 24 25 dataList.clear(); 26 27 for (DocumentFile file : listFiles) { 28 if (file.isDirectory()) { 29 } else if (file.getType().equals("image/jpeg")) { 30 fileName = file.getName(); 31 Uri childUri = file.getUri(); 32 String exifDateTime = ""; 33 if (childUri != null) { 34 try (InputStream inputStream = context.getContentResolver().openInputStream(childUri)) { 35 ExifInterface exif = new ExifInterface(inputStream); 36 exifDateTime = exif.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 dataList.add(fileName + " " + exifDateTime); 42 } 43 } 44 } 45 } 46 } 47 ); 48 49 public View onCreateView(@NonNull LayoutInflater inflater, 50 ViewGroup container, Bundle savedInstanceState) { 51 binding = FragmentSortBinding.inflate(getLayoutInflater()); 52 View root = binding.getRoot(); 53 54 // btnFolderにリスナー登録 55 Button btnFolder = binding.btnFolder; 56 btnFolder.setOnClickListener(new View.OnClickListener() { 57 @Override 58 public void onClick(View v) { 59 openFolder(); 60 } 61 }); 62 63 // リスト項目とListViewを対応付けるArrayAdapterを用意する 64 adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, dataList); 65 // ListViewにArrayAdapterを設定する 66 ListView listView = binding.listView; 67 listView.setAdapter(adapter); 68 69 return root; 70 } 71 72 // フォルダ選択(SAF) 73 private void openFolder() { 74 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 75 getFolderLauncher.launch(intent); 76 } 77 78 @Override 79 public void onDestroyView() { 80 super.onDestroyView(); 81 binding = null; 82 } 83}
質問の内容に誤りがありました。
「jpegファイルのExifに撮影年月日(TAG_DATETIME_ORIGINAL)が存在しているのは確認しています」としていますが、撮影年月日の無いjpegファイルもありました。
確認のとれた撮影年月日のあるjpegファイルでコードを実行したところ、問題なく取得できました。
質問を取り下げさせて頂きます。
あなたの回答
tips
プレビュー