我正在尝试使用Intent选择多个文件,但似乎我对某些内容缺失了 我创建了一个Intent.ACTION_GET_CONTENT Intent,将Intent.EXTRA_ALLOW_MULTIPLE作为额外的内容(它似乎完全符合目的)并创建一个选择器(可选),它选择应该能够选择多个文件并返回的应用程序他们。
问题是我只能选择一个文件。
我尝试了多个文件浏览器。 这是API 18(4.3)。
ACTIVITY_CHOOSE_FILE = 1; //global constant
Button btn = (Button) this.findViewById(R.id.btnGetFiles);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent chooseFile;
Intent intent;
chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("file/*");
chooseFile.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(intent, ACTIVITY_CHOOSE_FILE);
}
});
我还将此添加到Manifest(它在添加之前具有相同的功能):
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
为什么我不能选择多个文件?
(澄清:问题不是,多个文件没有返回 - 我不能选择多于1个文件)
答案 0 :(得分:8)
为什么我不能选择多个文件?
据推测,“应该能够选择多个文件并返回它们的应用程序”的实现没有实现EXTRA_ALLOW_MULTIPLE
支持。联系他们并请求此功能。
答案 1 :(得分:5)
我遇到了同样的问题。在这里我的解决方案。
<强>爪哇:强>
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == PICKFILE_RESULT_CODE) {
if(null != data) { // checking empty selection
if(null != data.getClipData()) { // checking multiple selection or not
for(int i = 0; i < data.getClipData().getItemCount(); i++) {
Uri uri = data.getClipData().getItemAt(i).getUri();
}
} else {
Uri uri = data.getData();
}
}
}
}
<强>科特林:强>
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
PICKFILE_RESULT_CODE -> if (resultCode === Activity.RESULT_OK) {
if (null != data) {
if (null !=data.clipData) {
for (i in 0 until data.clipData.itemCount) {
val uri = data.clipData.getItemAt(i).uri
dumpImageMetaData(uri)
}
} else {
val uri = data.data
dumpImageMetaData(uri)
}
}
}
}
}
答案 2 :(得分:1)
我遇到了同样的问题,ACTION_OPEN_DOCUMENT
为我工作。
public void selectImages() {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, your_initial_uri);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
startActivityForResult(intent, 1);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
for(int i = 0; i < data.getClipData().getItemCount(); i++) {
Uri uri = data.getClipData().getItemAt(i).getUri();
System.out.println("image" + i + "=" + uri.toString());
}
}
}
}
答案 3 :(得分:1)
我知道这是一个过时的帖子,但是仍然有人遇到它: 在此示例中,我们打开默认的系统文件浏览器,以允许用户在其设备上选择多个任何类型的文件:
Intent filesIntent;
filesIntent = new Intent(Intent.ACTION_GET_CONTENT);
filesIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
filesIntent.addCategory(Intent.CATEGORY_OPENABLE);
filesIntent.setType("*/*"); //use image/* for photos, etc.
startActivityForResult(filesIntent, REQUEST_CODE_FOR_ON_ACTIVITY_RESULT);
答案 4 :(得分:0)
在我看来,这是对我有用的解决方案,它允许我选择任何类型的文件。
// Start intent from your method
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("*/*");
startActivityForResult(intent, 1001);
// Get the result from this Overriden method
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 1001:
// Checking whether data is null or not
if (data != null) {
// Checking for selection multiple files or single.
if (data.getClipData() != null){
// Getting the length of data and logging up the logs using index
for (int index = 0; index < data.getClipData().getItemCount(); index++) {
// Getting the URIs of the selected files and logging them into logcat at debug level
Uri uri = data.getClipData().getItemAt(index).getUri();
Log.d("filesUri [" + uri + "] : ", String.valueOf(uri) );
}
}else{
// Getting the URI of the selected file and logging into logcat at debug level
Uri uri = data.getData();
Log.d("fileUri: ", String.valueOf(uri));
}
}
break;
}
}
}