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

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

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

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1381閲覧

[kotlin]アンドロイド端末の画像をアプリに表示する方法

koheiabe

総合スコア1

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/10/16 10:26

編集2021/10/16 10:30

【わからないこと】
下記URLを参考に端末内の画像をアプリに表示することを検討しております。
https://qiita.com/date62noka3/items/42f971fb0ee1be2970e8
MainActivity内で記述する場合は問題なく起動するのですが、Fragment内で記述すると「contentResolver」が赤字(エラー)となります。どうすればFragment内でもエラーにならずに済むかご存じの方、ご教示いただけないでしょうか。
下記コードになります。
【mainActivity内でのエラーが発生しないケース】

class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding= ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root)     binding.button.setOnClickListener { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "image/*" } startActivityForResult(intent, 42) } (略) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(requestCode == 42 && resultCode == Activity.RESULT_OK && data != null){ val bitmap = getBitmapFromUri(data.data) bitmap?:return binding.imageView3.setImageBitmap(bitmap) val context = applicationContext val dbHelper = FeedReaderDbHelper(context) val values = getContentValues(getBinaryFromBitmap(bitmap)) val db = dbHelper.writableDatabase val photoId = db.insert(PhotoTable.TABLE_NAME, null, values) db.close() Toast.makeText(this,"登録しました",Toast.LENGTH_LONG).show() } } private fun getBitmapFromUri(uri: Uri?): Bitmap? { uri?:return null val parcelFileDescriptor: ParcelFileDescriptor? = this.contentResolver.openFileDescriptor(uri, "r") parcelFileDescriptor?:return null val fileDescriptor: FileDescriptor = parcelFileDescriptor.fileDescriptor val image: Bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor) parcelFileDescriptor.close() return image }

 
【fragment内でのエラーが発生するケース】

class SecondFragment :Fragment() { private var _binding:FragmentSecondBinding?=null private val binding get()=_binding!! private lateinit var realm: Realm private val args:SecondFragmentArgs by navArgs() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) realm = Realm.getDefaultInstance() //ボタンが押されたらギャラリーを開く binding.appload.setOnClickListener { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "image/*" } startActivityForResult(intent, 42) } (略) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(requestCode == 42 && resultCode == Activity.RESULT_OK && data != null){ val bitmap = getBitmapFromUri(data.data) bitmap?:return binding.imageView3.setImageBitmap(bitmap) val context = applicationContext val dbHelper = FeedReaderDbHelper(context) val values = getContentValues(getBinaryFromBitmap(bitmap)) val db = dbHelper.writableDatabase val photoId = db.insert(PhotoTable.TABLE_NAME, null, values) db.close() Toast.makeText(this,"登録しました",Toast.LENGTH_LONG).show() } } private fun getBitmapFromUri(uri: Uri?): Bitmap? { uri?:return null val parcelFileDescriptor: ParcelFileDescriptor? = this.contentResolver.openFileDescriptor(uri, "r")**⇐エラー発生(contentResolver)** parcelFileDescriptor?:return null val fileDescriptor: FileDescriptor = parcelFileDescriptor.fileDescriptor val image: Bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor) parcelFileDescriptor.close() return image }

contentResolverについて下記などで調べてみたものの、原因が理解できずにおります。
https://developer.android.com/guide/topics/providers/content-providers

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

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

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

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

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

y_waiwai

2021/10/16 10:26

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
koheiabe

2021/10/16 10:31

さっそくご指摘ありがとうございます。大変助かります。 修正いたしました。
guest

回答1

0

ベストアンサー

contentResolver は Context のプロパティなので、フラグメントでは requireContext() を使うと良いでしょう。
参考: FragmentにおけるActivityとContextの使い分け - Qiita

diff

1 val parcelFileDescriptor: ParcelFileDescriptor? = 2- this.contentResolver.openFileDescriptor(uri, "r")**⇐エラー発生(contentResolver)** 3+ requireContext().contentResolver.openFileDescriptor(uri, "r")

投稿2021/10/16 11:49

編集2021/10/16 11:59
hoshi-takanori

総合スコア7901

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

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

koheiabe

2021/10/16 12:12

hoshiさん、また助けていただきありがとうございます。解決しました。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問