3

私は現在、ギャラリーから画像を受け取るためのインテント フィルターを持つ Android アプリケーションを持っています。ユーザーが選択したのと同じ順序で画像を受信することが重要です。これは、ほとんどのデバイスでデフォルトの動作のようですが、一部のデバイスではそうです (これまでのところ、Motorola で実行されている Android 4.x でこれを見てきました)。順序は未定義のようです。画像を順番に受け取る必要があることを意図して宣言する方法を知っている人はいますか? または、画像を受信して​​選択した順序を決定する方法はありますか?

マニフェストからの関連コードは次のとおりです

 <activity
       android:label="@string/app_name"
       android:name=".activities.ImportImagesActivity" > 
       <intent-filter>   
           <action android:name="android.intent.action.SEND" />
           <category android:name="android.intent.category.DEFAULT" /> 
           <data android:mimeType="image/*" />
       </intent-filter>
       <intent-filter>   
           <action android:name="android.intent.action.SEND_MULTIPLE" />
           <category android:name="android.intent.category.DEFAULT" /> 
           <data android:mimeType="image/*" />
       </intent-filter>
   </activity>

そして ImportImagesActivity から

private List<Uri> parseIncomingData() {
    List<Uri> uriList = null;

    Intent intent = this.getIntent();
    if(intent != null) {
        String action = intent.getAction();
        //Single Image
        if (action.equalsIgnoreCase("android.intent.action.SEND")) {
            //removed for brevity
            }
        }
        //Multiple Images
        else if (action.equalsIgnoreCase("android.intent.action.SEND_MULTIPLE")) {
            uriList  = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        }
    }

    //more code - at this point images have been recieved

    return uriList;
}

編集

少し背景を説明するために、アプリの一般的な流れを説明しましょう。ユーザーはギャラリーを開き、画像を選択します。彼らは私のアプリでそれらを「共有」することを選択します。私のアプリケーションは Uri のリストを受け取り、カスタム アダプター クラスに裏打ちされた内部ギャラリーを使用して表示されます。画像は Uri リストに基づいて正しく表示されます。問題は List<Uri> の順序が間違っている場合があることです。画像が選択した順序で表示されることは、ユーザーにとって重要です。

明確化 ギャラリーという用語を使用する場合、組み込みの Android アプリ ギャラリーを指しています。「共有」という用語を使用する場合、ギャラリー アプリ内の [共有] ボタンを指しています。これにより、ユーザーは Facebook、E メール、この場合は my app などのサービスのリストから選択できます。

たとえば、A、B、C の任意の順序で表示される 3 つの画像を含むギャラリーを想像してください。ユーザーは最初に C、次に A、B を選択し、それらをアプリと共有することを選択します。ほとんどの電話では、私のリストは {C、A、B} の順序で正しく並べられますが、問題のある電話では、この順序はランダムに見えます。

作成時間は通常、選択順序とは無関係であるため、作成タイムスタンプは使用できません。カスタム メタ データを追加しても、正しい初期順序がわからないため、役に立ちません。

4

2 に答える 2

1

ええ、私はちょうど今同じ問題に直面しました。また、Fedorの遅延読み込みの概念を使用しています。これがどこまで役立つか、これが正しいアプローチであるかどうかはわかりません。しかし、それでも私にとっては問題は解決しました。

getView()で少し変更を加える必要がありました。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    System.gc();

    ImageView view;

    if(convertView == null) {

        view = new ImageView(context);

        view.setScaleType(ImageView.ScaleType.FIT_CENTER);
        view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
        view.setAdjustViewBounds(false);
        view.setPadding(2, 2, 2, 2);



        System.gc();

    }else {
        view = (ImageView) convertView;
    }
      if(view!=null)
        {
               imageLoader.DisplayImage(urlList.get(position), view);
               notifyDataSetChanged();  //Calling this helped to solve the problem. 
        }

    System.gc();

    return view;
}
于 2013-01-17T05:02:39.813 に答える
1

私の観察では、Android ギャラリーは最新性に従って画像を表示します。

順序を特定できないデバイスの場合は、ギャラリーから画像をインポートして、作成時間を確認できます。これを行う方法は次のとおりです。または、メタデータ抽出アプリを使用することもできます。多くの jar が見つかります。

これで、画像を新しい順に並べるだけで完了です。

[編集]

質問があります。どの順番で選んでもいいとおっしゃっていましたが、「共有」してサーバーに「アップロード」しているのですか?

その場合、1 つの方法は、どの画像がアップロードされたかを確認することです。または、選択の順序が必要な場合は、これを行うことができます。画像のメタデータを編集します。無駄なタグが必ずあります。いずれかを選択して、タッチで編集します。したがって、画像 A を選択すると 1 に変わり、次に画像 B を選択すると 2 になります。しかし、画像 A の選択を解除すると、画像 B は 1 になります。したがって、ここでノードを使用できます。これは先入れ先出し (FIFO) 方式です。選択を解除すると、A がリストから除外され、B がそれを置き換えます。

これはあなたが望んでいたものですか?

編集 申し訳ありませんが、独自のギャラリーを作成しないとこれを行うことはできないと思います. Android ギャラリーをアプリのグリッド ビューにインポートしてみませんか?

于 2013-01-13T19:05:24.953 に答える