2018年4月13日金曜日

[Android]暗黙的Intentを受け取ることができるActivityの存在確認

この文書作成時の環境は以下です。

  • Kotlin 1.2.31
  • Android SDK 27

Intent#resolveActivity()

暗黙的Intentを用いてstartActivityすると、受け取れるActivityがないとき、ActivityNotFoundExceptionが発生するので、存在チェックをしなければならない。
一般的なインテント | Android Developersにあるとおり、Intent#resolveActivity()を使用する。
存在チェックはstartActivityのタイミングでするのではなく、Activity#onCreate()などでチェックして、存在しないならば機能を封印してしまうのが良い。

MainActivity.kt
...

fun Intent.existsImplicitReceiver(pm: PackageManager) : Boolean{
    return this.resolveActivity(pm) != null
}

class MainActivity : AppCompatActivity() {

    val cameraRequestCode:Int = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
         //  resolveActivityの結果がnullならば機能を封印する
        if(intent.resolveActivity(packageManager) == null){
            button_camera.isEnabled = false
        }

        button_camera.setOnClickListener {
            startActivityForResult(intent, cameraRequestCode)
        }
    }
}

0 コメント:

コメントを投稿