【问题标题】:Select multiple files with Intent.ACTION_GET_CONTENT使用 Intent.ACTION_GET_CONTENT 选择多个文件
【发布时间】:2013-10-22 09:08:47
【问题描述】:

我正在尝试使用 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);  
  }  
});

我还将它添加到清单中(在添加之前它具有相同的功能):

        <intent-filter>
            <action android:name="android.intent.action.GET_CONTENT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>  

为什么我不能选择多个文件?
(澄清一下:问题不是,没有返回多个文件 - 我不能选择超过 1 个文件)

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    我遇到了同样的问题。这是我的解决方案。

    Java:

    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)
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 此解决方案是正确的,因为它处理单个或多个选择文件或文档并返回 URI。
    【解决方案2】:

    为什么我不能选择多个文件?

    大概,“应该能够选择多个文件并返回它们的应用程序”的实现者没有实现EXTRA_ALLOW_MULTIPLE 支持。联系他们并申请此功能。

    【讨论】:

    • 想通了。这就是为什么我安装了大约 8 个不同的文件浏览器,试图排除这种情况。我想如果这是问题所在,最好自己实现一个简单的文件选择器,至少在它成为一个通用标准之前。
    • @Mercylez:EXTRA_ALLOW_MULTIPLE 是在 API 级别 18 中添加的,因此在ACTION_GET_CONTENT 的大部分实施者支持它之前还需要一段时间。特别是,如果应用程序没有用于内部目的的多选逻辑(例如,支持动作模式),实现起来可能有点困难。如果您绝对必须拥有多项选择支持,那么您别无选择,只能自己实现它。 ACTION_GET_CONTENT 永远不会保证为您提供多项选择。
    • @Mercylez:FWIW,我写了一篇博客,试图让更多人关注标准的这个新部分:commonsware.com/blog/2013/10/22/…
    • 我联系了 ES App Group,请求在他们的文件资源管理器中实现 EXTRA_ALLOW_MULTIPLE。谢谢你的帮助。
    【解决方案3】:

    我知道这是一个有点过时的帖子,但如果有人遇到它: 在此示例中,我们打开默认系统文件资源管理器以允许用户在其设备上选择多个任意类型的文件:

    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);
    

    【讨论】:

    • 感谢这对我有用!但是 onActivityResult 中的代码是什么。如何获取多个文件?
    【解决方案4】:

    这是我的解决方案,它对我有用,允许我选择任何类型的文件。

    // 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;
            }
        }
    }
    

    【讨论】:

    • OnActivityResult 代码对我有用.. 谢谢!
    【解决方案5】:

    我遇到了同样的问题,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) {
    // also check data.data because if the user select one file the file and uri will be in  data.data and data.getClipData() will be null
                for(int i = 0; i < data.getClipData().getItemCount(); i++) {
                    Uri uri = data.getClipData().getItemAt(i).getUri();
                    System.out.println("image" + i + "=" + uri.toString());                
                 }
            }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多