Java Android库选择-URI路径无效

Java Android库选择-URI路径无效,java,android,Java,Android,我正在尝试在Android设备上实现从图库中选择多个图像。我将按如下方式启动对话: Intent imageChoose = new Intent(); imageChoose.setType("image/*"); imageChoose.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); imageChoose.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.crea

我正在尝试在Android设备上实现从图库中选择多个图像。我将按如下方式启动对话:

Intent imageChoose = new Intent();
imageChoose.setType("image/*");
imageChoose.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
imageChoose.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(imageChoose, "Select Picture"), 1);
当我选择一个或多个images'onActivityResult'时,会触发,并返回意图数据,URI字符串是奇怪的。我附带了一个比较,比较了数据的uriString变量(来自常规选择器意图)与multi-select意图。我相信uriString的奇怪格式导致了我的上传失败。任何建议都会有帮助。如果我需要发布更多信息,请告诉我

编辑:

@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
开关(请求代码){
案例选择文件操作:
试一试{
if(data!=null&&data.getData()!=null&&resultCode==RESULT\u确定){
Uri selectedImageUri=data.getData();
字符串路径=getRealPathFromUri(这个,选择了dImageUri);
filePickerCallback.onFilePicked(新文件(路径));//发送文件以上载代码
}
else if(resultCode==RESULT\u取消){
filePickerCallback.onCancelled();
}
}
捕获(例外e){
Log.e(标记“获取文件选择器结果时出错”,e);
filePickerCallback.onError();
}
打破
案件摄影机和行动:
试一试{
最终文件f=新文件(mCurrentPhotoPath);
if(resultCode==RESULT\u OK){
onComplete=new Runnable(){
@凌驾
公开募捐{
f、 删除();
}
};
filePickerCallback.onFilePicked(f);
}
else if(resultCode==RESULT\u取消){
f、 删除();
filePickerCallback.onCancelled();
}
}
捕获(例外e){
Log.e(标记“获取文件选择器结果时出错”,e);
filePickerCallback.onError();
}
打破
案例多文件选择:
试一试{
if(数据!=null&&resultCode==RESULT\u确定){
clipdataclips=data.getClipData();
如果(剪辑!=null){
对于(int i=0;i
Uri值不必指向您可以读取的本地文件资源。有各种可能的
Uri
方案,包括所有标准的Internet方案(例如
http
)。从内容采集器的角度来看,您将主要获得
文件://
内容://
方案,随着时间的推移,后者的数量会更多

带有指向流的
content://
方案的
Uri
的行为非常类似于带有
http://
方案的
Uri
。两者都不一定指向某个本地文件。相反,您使用流本身(
openInputStream()
ContentResolver
上,对于
content://
,类似于
HttpUrlConnection
对于
http://
),独立获取MIME类型(
getType()
内容解析程序上,对于
内容://
,从
HTTP://
的HTTP头中获取它),并为文件名编写自己的概念,因为可能没有一个文件名可以从
Uri
本身派生出来

我很想深入探讨一下做这件事背后的原因
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case PICK_FILE_ACTION:
                try {
                    if (data != null && data.getData() != null && resultCode == RESULT_OK) {
                        Uri selectedImageUri = data.getData();
                        String path = getRealPathFromUri(this, selectedImageUri);
                        filePickerCallback.onFilePicked(new File(path)); // sends file to upload code
                    }
                    else if (resultCode == RESULT_CANCELED) {
                        filePickerCallback.onCancelled();
                    }
                }
                catch (Exception e) {
                    Log.e(TAG, "Error getting file picker result", e);
                    filePickerCallback.onError();
                }
                break;

            case CAMERA_ACTION:
                try {
                    final File f = new File(mCurrentPhotoPath);
                    if (resultCode == RESULT_OK) {
                        onComplete = new Runnable() {
                            @Override
                            public void run() {
                                f.delete();
                            }
                        };
                        filePickerCallback.onFilePicked(f);
                    }
                    else if (resultCode == RESULT_CANCELED) {
                        f.delete();
                        filePickerCallback.onCancelled();
                    }
                }
                catch (Exception e) {
                    Log.e(TAG, "Error getting file picker result", e);
                    filePickerCallback.onError();
                }
                break;

            case MULTI_FILE_SELECT:
                try {
                    if (data != null && resultCode == RESULT_OK) {

                        ClipData clips = data.getClipData();

                        if(clips != null) {
                            for(int i = 0; i < clips.getItemCount(); i++) {
                                ClipData.Item item = clips.getItemAt(i);
                                Uri uri = item.getUri();
                                File imageFile = new File(uri.toString());
                                // process each file...
                            }
                        }
                        else {
                            // user only selected a single image
                            Uri uri = data.getData();
                            File imageFile = new File(uri.toString());
                            // process single file
                        }

                    } else if (resultCode == RESULT_CANCELED) {
                        filePickerCallback.onCancelled();
                    }
                } catch (Exception e) {
                    Log.e(TAG, "Error getting file picker result", e);
                    filePickerCallback.onError();
                }
                break;

            default:
                Log.w(TAG, "onActivityResult got unknown request code " + requestCode);
        }

        super.onActivityResult(requestCode, resultCode, data);
    }


public static String getRealPathFromUri(Activity activity, Uri contentUri) {
        if (contentUri.getScheme() != null && contentUri.getScheme().equals("file")) {
            return contentUri.getPath();
        }
        else {
            Cursor cursor = null;
            try {
                String[] filePathField = {MediaStore.Images.Media.DATA};
                cursor = activity.getContentResolver().query(contentUri, filePathField, null, null, null);
                if (cursor == null) {
                    throw new IllegalArgumentException("got null cursor when attempting to find path for external storage uri");
                }

                cursor.moveToFirst();
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                return cursor.getString(column_index);
            }
            finally {
                if (cursor != null) cursor.close();
            }
        }
    }