2016-10-01 25 views
0

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

下面是代码:

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

感谢您的帮助!

+0

你在哪里看到重复?在Clipdata中还是在您制作的某个数组列表中? – greenapps

+0

发布这样一个大名单是没有意义的。我们必须检查吗?我们将如何做到这一点? – greenapps

+0

我在Clipdata和数组中看到了重复项,因为我正在从Clipdata创建一个数组。 @greenapps我在列表中仅包含一个参考列表,没有人需要检查它。重要的部分是它有重复。但是,如果有人认为实际结果是相关的,他们可以使用在线工具,如:http://www.somacon.com/p568.php查看重复项,也许看到一个模式。 – Leonti

回答

1

似乎它是Android Nougat中的一个错误。
我能够重现它在我的手机(Nexus 5X保护)和仿真器(谷歌蜜蜂24)
也许它以某种方式连接到“虚拟文件”中的牛轧糖SAF介绍: https://developer.android.com/about/versions/nougat/android-7.0.html#virtual_files

它可以作为预期Android 6.0模拟器

在这里创建了一个bug报告:https://code.google.com/p/android/issues/detail?id=224592

+0

该错误在Android 7.1 beta版中修复:) – Leonti