質問
JavaでAndroidアプリの開発をしています。
ギャラリーを開き写真を選択し、選択した写真をimageviewに表示させます。
また次起動した時もその写真を表示させたいので、取得したuriをプレファレンスデータに保存して、再表示させようとしています。
現在は写真を選択してimageviewに表示させる所までは出来たのですが、プレファレンスデータに保存したuriを取得してimageviewに表示させようとすると落ちてしまいます。
以下ソースになります。
★の所で落ちているみたいです。
保存したuriから表示出来ない事で原因が分かる方がいらっしゃいましたらご教授お願い致します。
①写真を選択してimageviewに表示
(流れ:取得したuriからbitmapに変換してimageviewに表示。またuriをuri.toString()で文字列にしてプレファレンスデータに保存)
private final ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent resultData = result.getData(); if (resultData != null) { try{ Uri uri = resultData.getData(); ParcelFileDescriptor pfDescriptor = getContentResolver().openFileDescriptor(uri, "r"); if(pfDescriptor != null){ FileDescriptor fileDescriptor = pfDescriptor.getFileDescriptor(); Bitmap bmp = BitmapFactory.decodeFileDescriptor(fileDescriptor); pfDescriptor.close(); ImageView imageView = (ImageView) findViewById(R.id.page61Image); imageView.setImageBitmap(bmp); //プレファレンスデータに文字列データを登録 SharedPreferences.Editor editor = PreferencesData.edit(); editor.putString("Data61Photo", uri.toString()); editor.apply(); TextView textView62 = findViewById(R.id.page62Edit); textView62.setText(uri.toString()); //P6-2のデータをテキストに表示 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } });
②プレファレンスデータからuriを取得してimageviewに表示
(流れ:プレファレンスデータから文字列のuriを取得して、Uri.parseでUriに戻し同様にbitmapにして表示させる)
private void func() throws IOException { Data61Photo = PreferencesData.getString("Data61Photo", null); //データを取得 if (Data61Photo != null) { Uri uri = Uri.parse(Data61Photo); ParcelFileDescriptor pfDescriptor = getContentResolver().openFileDescriptor(uri, "r"); ★ここで落ちる FileDescriptor fileDescriptor = pfDescriptor.getFileDescriptor(); Bitmap bmp = BitmapFactory.decodeFileDescriptor(fileDescriptor); pfDescriptor.close(); ImageView imageView = (ImageView) findViewById(R.id.page61Image); imageView.setImageBitmap(bmp); } }
補足
・保存前も保存後もuriをデバックすると以下表示となっています。
content://com.android.providers.media.documents/document/image%3A1000000044
・以下でも質問しましたがuriから絶対パスを取得出来ないことは分かりました。
https://teratail.com/questions/u21iy6lazjyuu0?_from_e=e_qctq_title
・パーミッションの指摘を受けましたが以下追加しました。
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
AndroidManifest.xmlに以下追加しました。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
しかしgetContentResolver().takePersistableUriPermissionで落ちてしまいます。
あまり理解出来ていないかもしれませんがパーミッション設定の方法が原因であればアドバイス願いたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/02/15 04:19
2023/02/15 06:26 編集
2023/02/15 08:23