【わからないこと】
下記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
回答1件
あなたの回答
tips
プレビュー