くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Android-Kotlin で ユーザーに画像を一枚選択させてその画像の場所を取得したい

はじまり

Android のアプリを作成していて、 ユーザーに画像を一枚選択してもらい、その画像に対してあれこれしたい。みたいな時があるかと思います。そんなときのための記事です。

プログラムの流れの解説

  1. 開きたい画像を選択させる Intent を飛ばす
  2. ユーザーは開きたい画像を選択する
  3. 選択され、 アプリに返ってきた Intent から必要な情報の取り出し・変換をする

コード

MainActivity.kt

UploadImage.setOnClickListener {
    val intent: Intent = Intent(Intent.ACTION_GET_CONTENT).apply {
        type = "image/*"
        addCategory(Intent.CATEGORY_OPENABLE)
    }
    startActivityForResult(intent, 6542)
    Toast.makeText(this, "Open Garally", Toast.LENGTH_LONG).show()
}

---

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == 6542) {
        if (resultCode != Activity.RESULT_OK) {
            return
        }
        val imageData = data?.data ?: return
        val imageURL: String =
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
                    val docID = DocumentsContract.getDocumentId(imageData)
                    val strSplittedDocId = docID.split(":")
                    val strId = strSplittedDocId[strSplittedDocId.size - 1]
                    val cursor = contentResolver.query(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            arrayOf(MediaStore.MediaColumns.DATA),
                            "_id=?",
                            arrayOf<String>(strId),
                            null
                    )
                    cursor.moveToFirst()
                    cursor.getString(0)
                } else {
                    val projection = arrayOf(MediaStore.MediaColumns.DATA, MediaStor
                    val corsor = contentResolver.query(imageData, projection, null, 
                    if (!corsor.moveToFirst()) return
                    val imageURL = corsor.getString(0) ?: ""
                    corsor.close()
                    imageURL
                }
        Toast.makeText(this,"URL; " + imageURL?:"",Toast.LENGTH_LONG)
    }
}