質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android

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

Q&A

0回答

844閲覧

android開発/Javaでギャラリーから写真を選択して、そのファイルのパス情報を取得したいです。

rstaff

総合スコア2

Java

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

Android

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

0グッド

0クリップ

投稿2023/02/08 07:15

編集2023/02/09 01:11

実現したいこと

android開発/Javaでギャラリーから写真を選択して、そのファイルのパス情報を取得したいです。

質問

ActivityResultLauncherを使用して写真の操作をしています。

private final ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent resultData = result.getData(); Uri uri = resultData.getData(); Cursor c = getContentResolver().query(uri, new String[] { MediaStore.MediaColumns.DATA }, null, null, null); c.moveToFirst(); String path = c.getString(0); c.close(); } });

・pathの値は何も表示されませんでした。
・uri.toString()は「content://com.android.providers.media.documents/document/image%3A1000000040」と表示されます。
・「new String[] { MediaStore.MediaColumns.DATA }」の所をnullにしてc.getString(2)を表示すると「IMG_2022-12-27-15-49-04-469.jpg」でした。
ここの引数の気もするのですが分かりませんでした。

このソースもしくは違うやり方でも良いので絶対パスの取得方法をご教授下さい。

追加質問

実は言うとギャラリーで選択した画像をimageViewで表示させるのは出来たのですが、そのuriをプレファレンスデータに保存して再度開いた時に保存したプレファレンスデータから画像を表示させようとしています。
しかし保存したデータから表示することが出来ませんでした。

▼ギャラリーを開いて、選択された写真のuriを取得し、imageviewに保存&プレファレンスデータに保存する処理です。

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(); } } } });

▼保存したプレファレンスデータから再度imageviewに表示させる処理(このIntentに遷移すると落ちてしまいます)

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); }

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

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

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

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

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

jimbe

2023/02/08 08:18

コンテンツプロバイダが必ずしも共用のパスに存在するデータを返すとは限りません。 従って、絶対パスなるモノが必ずあるという前提はしない方が良いと思います。
mingos

2023/02/08 08:27

Androidでは絶対パスを取得できない、もしくは取得できたとしてもアクセスできない場合があると考えたほうが良いです。 あくまでもuri経由でファイルにアクセスする事を前提にアプリを設計、実装したほうがいいと思います。
rstaff

2023/02/08 08:31

ご回答ありがとうございます。 そうなんですね。。。 実は言うとギャラリーで選択した画像をimageViewで表示させるのは出来たのですが、そのuriを「editor.putString("Data61Photo", uri.toString());」でプレファレンスデータに保存して再度開いた時に保存したプレファレンスデータから画像を表示させようとしています。 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を文字列で変換⇒保存して、再度利用することは出来ないのでしょうか。
jimbe

2023/02/08 09:10

>ギャラリーで選択した画像をimageViewで表示させるのは出来た そのコードを、質問を編集して追加ご提示して頂けますか。
hoshi-takanori

2023/02/08 16:34

SharedPreference に画像などの大きなデータを保存するのは推奨されません。普通にファイルとしてコピーすれば良いのでは。
rstaff

2023/02/09 01:16

> jimbe様 質問欄にコード追加しました。 お手数ですがご確認お願い致します。 > hoshi-takanori様 「editor.putString("Data61Photo", uri.toString());」でuriの文字列だけ保存した認識なのですが実データが保存されるのでしょうか。 uriはパスのようなイメージでしたが認識が違うのでしょうか。
rstaff

2023/02/10 06:13

追加質問で記載したギャラリーを開いた時の処理の「Uri uri = resultData.getData();」の次に以下追加しました。 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で落ちてしまいます。 あまり理解出来ていないかもしれませんがパーミッション設定はどうすれば良いでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問