intent.resolveActivity returns 在 API 30 中的 android.intent.action.OPEN_DOCUMENT 上为空
intent.resolveActivity returns null on android.intent.action.OPEN_DOCUMENT in API 30
我在选择 pdf 文件时遇到问题。
之前,targetSdk 是 29,它工作正常,但是当我将它更新到 30 时,Android 11 及以上的设备无法打开文件管理器来选择 pdf 文件。版本低于 Android 11 的设备工作正常。
这是创建 Intent 的代码:
Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setType("application/pdf");
这是启动 Intent 的代码:
boolean canBeLaunched = false;
if (intent.resolveActivity(fragment.getActivity().getPackageManager()) != null) {
canBeLaunched = true;
fragment.startActivityForResult(intent, requestCode);
}
在调试时,intent.resolveActivity returns 在 Android 11 及更高版本上为空。
在 Android 11 中对包可见性进行了一些更改,一些信息 HERE and HERE
注意 resolveActivity
应该 return 可以处理此意图的应用程序包名称。这违反了上述新引入的规则和新政策
而不是尝试 运行 startActivityForResult
严格地没有你的 if
并将其包装在 try { ... } catch (ActivityNotFoundException ex){}
boolean canBeLaunched;
try {
fragment.startActivityForResult(intent, requestCode);
canBeLaunched = true
} catch (ActivityNotFoundException ex){
canBeLaunched = false
}
我在选择 pdf 文件时遇到问题。 之前,targetSdk 是 29,它工作正常,但是当我将它更新到 30 时,Android 11 及以上的设备无法打开文件管理器来选择 pdf 文件。版本低于 Android 11 的设备工作正常。 这是创建 Intent 的代码:
Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setType("application/pdf");
这是启动 Intent 的代码:
boolean canBeLaunched = false;
if (intent.resolveActivity(fragment.getActivity().getPackageManager()) != null) {
canBeLaunched = true;
fragment.startActivityForResult(intent, requestCode);
}
在调试时,intent.resolveActivity returns 在 Android 11 及更高版本上为空。
在 Android 11 中对包可见性进行了一些更改,一些信息 HERE and HERE
注意 resolveActivity
应该 return 可以处理此意图的应用程序包名称。这违反了上述新引入的规则和新政策
而不是尝试 运行 startActivityForResult
严格地没有你的 if
并将其包装在 try { ... } catch (ActivityNotFoundException ex){}
boolean canBeLaunched;
try {
fragment.startActivityForResult(intent, requestCode);
canBeLaunched = true
} catch (ActivityNotFoundException ex){
canBeLaunched = false
}