如果文件是从文件管理器中选择的,为什么Android File Chooser和intent action\u OPEN\u文档在某些设备上不起作用?

如果文件是从文件管理器中选择的,为什么Android File Chooser和intent action\u OPEN\u文档在某些设备上不起作用?,android,android-intent,redmi-device,Android,Android Intent,Redmi Device,我试图在Android上使用intent action\u OPEN\u文档来选择PDF文件,但在某些设备上,该文件为空 我希望用户仅从其设备中选择PDF文件。为此,我使用了intent-action\u-OPEN\u文档 这在大多数设备上都能正常工作,但在一些设备上(主要是小米),在文件选择上,它在尝试使用选项文件管理器获取onActivityResult中的intent data intent.getData时为空,如下图所示 我试图避免使用action\u GET\u内容,因为第三方应用程

我试图在Android上使用intent action\u OPEN\u文档来选择PDF文件,但在某些设备上,该文件为空

我希望用户仅从其设备中选择PDF文件。为此,我使用了intent-action\u-OPEN\u文档

这在大多数设备上都能正常工作,但在一些设备上(主要是小米),在文件选择上,它在尝试使用选项文件管理器获取onActivityResult中的intent data intent.getData时为空,如下图所示

我试图避免使用action\u GET\u内容,因为第三方应用程序不会将内容限制为pdf格式。其他应用程序也允许使用非PDF格式

在从“文件管理器”菜单中选择“文件”的图像中,它将null设为intent.getData,但在我选择“从文档中选择文档”选项时,它工作正常

下面是文件选择器请求的代码

Intent intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/pdf");
startActivityForResult(Intent.createChooser(intent, "Choose a file"), Constants.FILE_CHOOSER);
选择文件后

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        final Uri uri = intent.getData(); //Uri is null
    }
}
我希望intent.getData中有一些数据,但它的值为null

致命异常:java.lang.RuntimeException:无法将结果ResultInfo{who=null,request=501,result=-1,data=Intent{has extras}}传递到活动{com.avail.easyloans.android/com.avail.easyloans.feature.cashup.activities.documents.ActivityUploadBanksmt}}:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String android.net.Uri.getAuthority”


可能的错误是什么?

文件管理器不是Android的一部分。这可能是您安装的应用程序,也可能是预安装的应用程序。而且,它似乎有一两个bug。@commonware谢谢。是的,文件管理器预装在小米红米4A上。那么,有没有其他方法可以强制用户只选择PDF文件?还有,有没有方法可以从选择器中删除此文件管理器选项?@MDNaseemAshraf,当然@PrashantJha:有没有其他方法可以强制用户只选择PDF文件如果这是你的意思的话,没有保证的方法。有没有办法从选择器中删除此文件管理器选项?-我会先对小米大喊大叫,因为他们不应该执行行动文件。之后。。。一种危险的方法是使用setPackage,目的是将其限制在OS文档UI中。我不记得那个应用程序ID是什么,我也不确定它是否会在所有Android设备上保持一致。所以,我会专注于防御性编程,并接受它。