尝试导入包含表情符号

时间:2017-05-24 09:09:20

标签: android import uri decode

我在我的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

有人可以帮助我吗? 弗朗索瓦

1 个答案:

答案 0 :(得分:0)

无法保证ContentResolver.openFileDescriptor()适用于任意content:个URI。该文档包含以下警告:

  

打开原始文件描述符以访问URI下的数据。这类似于openAssetFileDescriptor(Uri,String),但使用底层的openFile(Uri,String)方法,因此不能与返回文件子节的提供程序一起使用。如果可能的话,你应该使用openAssetFileDescriptor(Uri,String)。如果提供程序返回文件的子部分,您将收到FileNotFoundException异常。

对于大多数用例,ContentResolver.openInputStream()是首选方案。