存储访问框架的ACTION_OPEN_DOCUMENT返回重复的结果

时间:2016-10-01 08:29:42

标签: android storage-access-framework

我正在尝试使用Storage Access Framework选择图像并将其上传到我的服务器 我遇到的问题是,在选择文件后,我得到包含重复项的结果 我在文件夹中有279张照片 ACTION_OPEN_DOCUMENT返回279个结果,但其中一些是重复的,所以有时我得到275个独特的结果,有时候是268个等等。 重复项随机出现,因此它们不是特定文件。

以下是代码:

int PICKER_CODE = 123;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(Intent.createChooser(intent,
                        "Select images"), PICKER_CODE);
            }

        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode != Activity.RESULT_OK) {
        Toast.makeText(this, "Nothing was chosen", Toast.LENGTH_LONG).show();
        return;
    }

    if (requestCode == PICKER_CODE) {

        ClipData clipData = data.getClipData();

        if (clipData != null) {

            Set<Uri> uniqueUris = new HashSet<>();

            for (int i = 0; i < clipData.getItemCount(); i++) {
                Uri photoUri = clipData.getItemAt(i).getUri();

                uniqueUris.add(photoUri);

                Log.i("IMAGE PICKER", "photo: " + photoUri);
            }

            String stats =
                    "all: " + clipData.getItemCount()
                            + ", unique: " + uniqueUris.size();

            Log.i("IMAGE PICKER", "stats: " + stats);

            Toast.makeText(this, stats, Toast.LENGTH_LONG).show();

            TextView textView = (TextView) findViewById(R.id.output_text);
            textView.setText(stats);
        }
    }

}

活动的完整代码位于:https://github.com/Leonti/android-saf-duplicates/blob/master/app/src/main/java/com/example/leonti/googledriveduplicatesdebugging/MainActivity.java

以下是可以重现问题的示例Android应用: https://github.com/Leonti/android-saf-duplicates 只需将其安装在手机上,选择一些图像(越多越好),它会告诉您总计数和唯一条目的数量。

如果我从Google云端硬盘或照片中选择照片并不重要,大部分时间我都会获得重复的结果。

无法弄清楚出了什么问题。 我在Android模拟器上执行了相同的代码(使用了其他帐户并共享了此Google云端硬盘文件夹)并且按预期工作 - 所有结果都是唯一的。

我在Nexus 5X上运行Android 7.0

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

似乎它是Android Nougat中的一个错误 我能够在手机(Nexus 5X)和模拟器(Google Apis 24)上重现它 也许它以某种方式连接到&#34;虚拟文件&#34;在Nougat SAF中介绍: https://developer.android.com/about/versions/nougat/android-7.0.html#virtual_files

在Android 6.0模拟器上按预期工作

在此处创建了错误报告:https://code.google.com/p/android/issues/detail?id=224592