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
}