ACTION_OPEN_DOCUMENT 使用存储访问框架 returns 重复结果
ACTION_OPEN_DOCUMENT with Storage Access Framework returns duplicate results
我正在尝试 select 使用存储访问框架的图像并将它们上传到我的服务器。
我遇到的问题是 selecting 文件后我得到的结果包含重复项。
我的文件夹里有279张照片。
ACTION_OPEN_DOCUMENT
returns 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);
}
}
}
activity 的完整代码在这里: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
只需将它安装在 phone、select 一些图像上(越多越好),它会告诉您总计数和唯一条目数。
无论我 select 照片来自 Google Drive 还是来自 Photos,大多数时候我得到重复的结果。
无法弄清楚出了什么问题。
我在 Android 模拟器上执行了相同的代码(使用了另一个帐户并共享了这个 Google Drive 文件夹)并且它按预期工作 - 所有结果都是独一无二的。
我是 运行 Android Nexus 5X 上的 7.0
感谢您的帮助!
这似乎是 Android 牛轧糖中的错误。
我能够在我的 phone (Nexus 5X) 和模拟器 (Google Apis 24)
上重现它
也许它与 Nougat SAF 中引入的 "virtual files" 有某种联系:
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
我正在尝试 select 使用存储访问框架的图像并将它们上传到我的服务器。
我遇到的问题是 selecting 文件后我得到的结果包含重复项。
我的文件夹里有279张照片。
ACTION_OPEN_DOCUMENT
returns 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);
}
}
}
activity 的完整代码在这里: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 只需将它安装在 phone、select 一些图像上(越多越好),它会告诉您总计数和唯一条目数。
无论我 select 照片来自 Google Drive 还是来自 Photos,大多数时候我得到重复的结果。
无法弄清楚出了什么问题。 我在 Android 模拟器上执行了相同的代码(使用了另一个帐户并共享了这个 Google Drive 文件夹)并且它按预期工作 - 所有结果都是独一无二的。
我是 运行 Android Nexus 5X 上的 7.0
感谢您的帮助!
这似乎是 Android 牛轧糖中的错误。
我能够在我的 phone (Nexus 5X) 和模拟器 (Google Apis 24)
上重现它
也许它与 Nougat SAF 中引入的 "virtual files" 有某种联系:
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