この文書作成時の環境は以下です。
- Kotlin 1.2.31
- Android SDK 27
> Intent#resolveActivity()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 件のコメント:
コメントを投稿