2020年11月5日木曜日

Android 11 では ACTION_CREATE_DOCUMENT と ACTION_OPEN_DOCUMENT には <queries> 指定が必要

Intent.ACTION_CREATE_DOCUMENT および Intent.ACTION_OPEN_DOCUMENT を startActivityForResult() で呼び出す以下のコードは、targetSdkVersion が 29 (Android 10)までは問題なく動きます。 private fun createDocument() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("*/*") .putExtra(Intent.EXTRA_TITLE, "log.txt") if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT) } else { Toast.makeText( this, "Unable to resolve Intent.ACTION_CREATE_DOCUMENT", Toast.LENGTH_SHORT ) .show() } } private fun openDocument() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("*/*") if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT) } else { Toast.makeText( this, "Unable to resolve Intent.ACTION_OPEN_DOCUMENT", Toast.LENGTH_SHORT ) .show() } } しかし、targetSdkVersion を 30 (Android 11)にすると、intent.resolveActivity(packageManager) が null を返すようになってしまいます。

Android 11 では AndroidManifest.xml に以下の <queries> を指定すると動くようになります。 <manifest ...> ... <queries> <intent> <action android:name="android.intent.action.CREATE_DOCUMENT" /> <data android:mimeType="*/*" /> </intent> <intent> <action android:name="android.intent.action.OPEN_DOCUMENT" /> <data android:mimeType="*/*" /> </intent> </queries> ... </manifest>



0 件のコメント:

コメントを投稿