回答編集履歴

5

修正

2023/05/24 12:11

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -105,5 +105,5 @@
105
105
  System.err com.teratail.q_om48pea6fnsgqi W at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
106
106
  ```
107
107
  というのが出ました。
108
- ビューは真っ白ですがアプリは落ちませんでした。
108
+ 35 行目の openInputStreamで FileNotFoundException が発生しビューは真っ白ですがアプリは落ちませんでした。
109
109
 

4

修正

2023/05/24 12:07

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -15,7 +15,7 @@
15
15
  }
16
16
  ```
17
17
  ---
18
- 以前の質問([uriデータをプレファレンスデータに保存して使用する事が出来ない(android/java)](https://teratail.com/questions/om48pea6fnsgqi)) コードでプリファレンスから取得して表示する部分を回答のコードに変えると
18
+ 以前の質問([uriデータをプレファレンスデータに保存して使用する事が出来ない(android/java)](https://teratail.com/questions/om48pea6fnsgqi)) に回答したコードでプリファレンスから取得して表示する部分をコードに変えると
19
19
  ```java
20
20
  package com.teratail.q_om48pea6fnsgqi;
21
21
 

3

追加

2023/05/24 12:05

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -14,3 +14,96 @@
14
14
  e.printStackTrace();
15
15
  }
16
16
  ```
17
+ ---
18
+ 以前の質問([uriデータをプレファレンスデータに保存して使用する事が出来ない(android/java)](https://teratail.com/questions/om48pea6fnsgqi)) のコードでプリファレンスから取得して表示する部分を回答のコードに変えると
19
+ ```java
20
+ package com.teratail.q_om48pea6fnsgqi;
21
+
22
+ import android.content.*;
23
+ import android.graphics.*;
24
+ import android.net.Uri;
25
+ import android.os.*;
26
+ import android.util.Log;
27
+ import android.widget.ImageView;
28
+
29
+ import androidx.activity.result.ActivityResultLauncher;
30
+ import androidx.activity.result.contract.ActivityResultContracts;
31
+ import androidx.appcompat.app.AppCompatActivity;
32
+
33
+ import com.google.android.material.floatingactionbutton.FloatingActionButton;
34
+
35
+ import java.io.*;
36
+
37
+ public class MainActivity extends AppCompatActivity {
38
+ private static final String LOG_TAG = "MainActivity **";
39
+
40
+ @Override
41
+ protected void onCreate(Bundle savedInstanceState) {
42
+ super.onCreate(savedInstanceState);
43
+ setContentView(R.layout.activity_main);
44
+
45
+ ImageView imageView = findViewById(R.id.imageView);
46
+
47
+ SharedPreferences pref = getPreferences(MODE_PRIVATE);
48
+
49
+ String uriStr = pref.getString("uri", null);
50
+ if(uriStr != null) {
51
+ Uri uri = Uri.parse(uriStr);
52
+ Log.d(LOG_TAG, "pref uri=" + uri);
53
+ //imageView.setImageURI(uri);
54
+ try(InputStream is = new BufferedInputStream(getContentResolver().openInputStream(uri))) {
55
+ Bitmap bitmap = BitmapFactory.decodeStream(is);
56
+ imageView.setImageBitmap(bitmap);
57
+ } catch(IOException e) {
58
+ e.printStackTrace();
59
+ }
60
+ }
61
+
62
+ ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), uri -> {
63
+ Log.d(LOG_TAG, "image uri=" + uri);
64
+ imageView.setImageURI(uri);
65
+ if(Build.VERSION.SDK_INT >= 19) {
66
+ Log.d(LOG_TAG, "takePersistableUriPermission");
67
+ getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
68
+ }
69
+ Log.d(LOG_TAG, "pref save");
70
+ pref.edit().putString("uri", uri.toString()).commit();
71
+ });
72
+
73
+ FloatingActionButton fab = findViewById(R.id.fab);
74
+ fab.setOnClickListener(v -> {
75
+ Log.d(LOG_TAG, "launch selector");
76
+ launcher.launch(new String[]{"image/*"});
77
+ });
78
+ }
79
+ }
80
+ ```
81
+ となり、Download フォルダの png を選択表示後にアプリを終わらせて画像を削除しアプリを再実行すると Logcat には
82
+ ```
83
+ MainActivity ** com.teratail.q_om48pea6fnsgqi D pref uri=content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2F1-6J%E9%80%9A%E9%81%8E%E8%89%A6%E9%9A%8A.png
84
+ System.err com.teratail.q_om48pea6fnsgqi W java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
85
+ System.err com.teratail.q_om48pea6fnsgqi W at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
86
+ System.err com.teratail.q_om48pea6fnsgqi W at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:781)
87
+ System.err com.teratail.q_om48pea6fnsgqi W at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1983)
88
+ System.err com.teratail.q_om48pea6fnsgqi W at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1798)
89
+ System.err com.teratail.q_om48pea6fnsgqi W at android.content.ContentResolver.openInputStream(ContentResolver.java:1475)
90
+ System.err com.teratail.q_om48pea6fnsgqi W at com.teratail.q_om48pea6fnsgqi.MainActivity.onCreate(MainActivity.java:35)
91
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.Activity.performCreate(Activity.java:7994)
92
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.Activity.performCreate(Activity.java:7978)
93
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
94
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
95
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
96
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
97
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
98
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
99
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
100
+ System.err com.teratail.q_om48pea6fnsgqi W at android.os.Handler.dispatchMessage(Handler.java:106)
101
+ System.err com.teratail.q_om48pea6fnsgqi W at android.os.Looper.loop(Looper.java:223)
102
+ System.err com.teratail.q_om48pea6fnsgqi W at android.app.ActivityThread.main(ActivityThread.java:7656)
103
+ System.err com.teratail.q_om48pea6fnsgqi W at java.lang.reflect.Method.invoke(Native Method)
104
+ System.err com.teratail.q_om48pea6fnsgqi W at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
105
+ System.err com.teratail.q_om48pea6fnsgqi W at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
106
+ ```
107
+ というのが出ました。
108
+ ビューは真っ白ですがアプリは落ちませんでした。
109
+

2

修正

2023/05/23 07:43

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -1,4 +1,4 @@
1
- ギャラリー選択アプリからの URI であれば、 ContentResolver の openInputStream 等でオープンする事で無ければ FileNotFoundException が発生するのでは。(試していません。)
1
+ ギャラリー選択アプリからの URI であれば、 ContentResolver の openInputStream 等でオープンする事で該当データが無ければ FileNotFoundException が発生するのでは。(試していません。)
2
2
 
3
3
  https://developer.android.com/reference/android/content/ContentResolver#openInputStream(android.net.Uri)
4
4
 

1

追加

2023/05/23 07:42

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -3,3 +3,14 @@
3
3
  https://developer.android.com/reference/android/content/ContentResolver#openInputStream(android.net.Uri)
4
4
 
5
5
  有ったら別スレッドで読んで Bitmap にして setImageBitmap すれば UI スレッドで読み込みしなくて済みますし。
6
+
7
+ ↓こんな感じのことです。(別スレッドにはしていませんが。)
8
+ ```java
9
+ //imageView.setImageURI(uri);
10
+ try(InputStream is = new BufferedInputStream(getContentResolver().openInputStream(uri))) {
11
+ Bitmap bitmap = BitmapFactory.decodeStream(is);
12
+ imageView.setImageBitmap(bitmap);
13
+ } catch(IOException e) {
14
+ e.printStackTrace();
15
+ }
16
+ ```