0

Storage Access Framework を使用して画像を選択し、サーバーにアップロードしようとしています。
私が遭遇している問題は、ファイルを選択した後に重複を含む結果が得られることです。
フォルダには 279 枚の写真があります。
ACTION_OPEN_DOCUMENT279 の結果を返しますが、それらのいくつかは重複しているため、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 アプリのサンプルは次のとおり です。合計数と一意のエントリ数。

写真を Google Drive から選択するか、Photos から選択するかは関係ありません。ほとんどの場合、結果が重複します。

何が問題なのかわかりません。Androidエミュレーターで同じコードを実行しました(別のアカウントを使用し、このGoogleドライブフォルダーを共有しました)、期待どおりに機能しています-すべての結果は一意です.

Nexus 5X で Android 7.0 を実行しています

助けてくれてありがとう!

4

1 に答える 1

1

Android Nougat のバグのようです。
携帯電話 (Nexus 5X) とエミュレーター (Google Apis 24) で再現できまし
た。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

于 2016-10-06T11:54:24.310 に答える