🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2132閲覧

Roomデータベースに保存していたURIから画像を得てimageViewに表示させたい

kurobaron

総合スコア3

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2021/03/07 14:21

編集2021/03/08 03:50

現在Androidアプリの開発をしており、MainActivityではないページでギャラリーから画像を選択してそれらのURIをRoomデータベースに保存し、MainActivityのonCreateやonStartのタイミングでRoomデータベースから保存されているURIを取得してそれが表す画像をimageViewに設定する機能を実現したいと考えています。
しかしURIをデータベースに保存するところ、データベースからURIを取得するところまでは上手くいくのですが、取得したURIからimageViewに画像を設定するところでエラーが発生してしまいます。
データベースからURIを取得するコードは

Java

1FetchPicData fetchPicData = new FetchPicData(); 2fetchPicData.start(); 3 4while(true){ 5 try{ 6 Thread.sleep(100L); 7 } catch (InterruptedException e){ 8 System.out.println(e.getMessage()); 9 } 10 if(fetchPicData.isFinished()){ 11 break; 12 } 13} 14String[] uris = fetchPicData.getUris();

    
で、fetchPicDataクラスが

Java

1public class FetchPicData extends Thread { 2 private String[] uris; 3 private boolean finished; 4 5 public void run() { 6 AppDatabase db = AppDatabaseSingleton.getInstance(GetContext.getAppContext()); 7 PictureDao pictureDao = db.pictureDao(); 8 uris = pictureDao.getUriList(); 9 finished = true; 10 } 11 12 public String[] getUris(){ 13 return uris; 14 } 15 16 public boolean isFinished(){ 17 return finished; 18 } 19}

となっており、取得したURIからimageViewに画像を設定する箇所のコードは

Java

1try { 2 Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(uris[i])); 3 imageView.setImageBitmap(bitmap); 4}catch (IOException e) { 5 e.printStackTrace(); 6}

となっており(urisはString[]型でURIを表す文字列を格納しています)、エラーの文は

/com.example.piccapture E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.piccapture, PID: 31922 java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord{ecaa030 31922:com.example.piccapture/u0a148} (pid=31922, uid=10148) that is not exported from UID 10117 at android.os.Parcel.createException(Parcel.java:2071) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:5054) at android.app.ActivityThread.acquireProvider(ActivityThread.java:6561) at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2725) at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2117) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1671) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503) at android.content.ContentResolver.openInputStream(ContentResolver.java:1187) at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:1707) at com.example.PicCapture.MainActivity.createView(MainActivity.java:152) at com.example.PicCapture.MainActivity.onStart(MainActivity.java:66) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425) at android.app.Activity.performStart(Activity.java:7825) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:6820) at com.android.server.am.ActivityManagerService.getContentProvider(ActivityManagerService.java:7240) at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2078) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2741) at android.os.Binder.execTransactInternal(Binder.java:1021)

となっています。(piccaptureはアプリ名です)
Permission Denialとあったので外部ストレージの書き込み権限を付与するようにしてみたのですがうまくいかず、エラーの文で検索をかけてみましたが解決することができませんでした。 
当方Androidアプリの開発初心者のため行き詰ってしまい困っています。どなたかお力添えをいただけると大変ありがたいです。ご回答よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/03/08 02:30

とりあえずエラーメッセージとコードはMarkDownの<code>ブロック内に貼り付けてご提示ください。
kurobaron

2021/03/08 03:50

ご指摘を受け修正致しました。失礼致しました。
hoshi-takanori

2021/03/08 08:14 編集

ギャラリーから画像を選択した場合に返る URL は、プライバシー保護のために一時的な URL のような…。
kurobaron

2021/03/08 09:27

ご回答ありがとうございます。 そうなのですね!ではパスを保存した方が良いのでしょうか。少し試してみます。
kurobaron

2021/03/08 09:43

貴重な情報をありがとうございます!帰宅後早速試してみてまたご報告させていただきます。
kurobaron

2021/03/08 14:43

takePersistableUriPermissionを試してみたところ、今度はRuntimeExceptionが発生してしまいうまくいきませんでした。明日色々試してみようと思います。
guest

回答1

0

自己解決

類似の質問を投稿するため、一度締め切らせていただきます。ご助言をいただきありがとうございました。

投稿2021/03/09 08:52

kurobaron

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問