我在我的Android应用程序中编写了一些代码来导入文件
我导入像foo.bar
这样的文件时效果很好,但当我尝试导入包含foo.bar
每当我尝试使用contentResolver中的 openFileDescriptor 方法时,我都会遇到 FileNotFoundException ...
ParcelFileDescriptor pfd = mActivity.getContentResolver().openFileDescriptor(mImportUri, "r");
以下是 mImportUri 的值:
content://com.android.externalstorage.documents/document/primary%3ADownload%2Ffoo%20%F0%9F%98%AD.bar
我假设openFileDescriptor不支持URI中的%20%F0%9F%98%AD
,但我不知道如何修复它?
修改
一个简单的用例。只有1个按钮和一个TextView来获得结果。
当我试图让foo.bar
正常工作时 - > result = OK但是当我选择foo.bar
时,结果是KO - >所以我有一个例外。
MainActivity.java
public final static int IMPORT_NEBO_REQUEST = 0;
public TextView resText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resText = (TextView) findViewById(R.id.result_text);
findViewById(R.id.import_button).setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
//This will start the appropriate app able to pick a file
startActivityForResult(intent, IMPORT_NEBO_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMPORT_NEBO_REQUEST && resultCode == RESULT_OK) {
Uri uri = data.getData();
try {
ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r");
resText.setText("OK");
} catch (Exception e) {
e.printStackTrace();
resText.setText("KO");
}
}
}
三星GTab 12pce上的 不工作 - > Android 5.0.2
三星GTab 3上的工作 - > Android 7
华为M2上的不工作 - > Android 5.1.1
Nvidia sheld上的不工作 - > Android 6
OnePlus 3上的工作 - > Android 7.1.1
有人可以帮助我吗? 弗朗索瓦
答案 0 :(得分:0)
无法保证ContentResolver.openFileDescriptor()
适用于任意content:
个URI。该文档包含以下警告:
打开原始文件描述符以访问URI下的数据。这类似于openAssetFileDescriptor(Uri,String),但使用底层的openFile(Uri,String)方法,因此不能与返回文件子节的提供程序一起使用。如果可能的话,你应该使用openAssetFileDescriptor(Uri,String)。如果提供程序返回文件的子部分,您将收到FileNotFoundException异常。
对于大多数用例,ContentResolver.openInputStream()是首选方案。