Java Android库选择-URI路径无效
我正在尝试在Android设备上实现从图库中选择多个图像。我将按如下方式启动对话: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
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();
}
}
}