2012-02-14 11 views
5

私は、現在市場に出回っている私のアプリに重要なアップデートを出荷しようとしています。私は、MediaStoreのサムネイルを照会し、サムネイルをGridViewにロードする必要があります。これまでのところ、今のところ、サムネイルへのパスである私のものだけに基づいて、実際のフルサイズの画像のパスをユーザーの外部ストレージに取得する必要があります。ユーザーがサムネイル、共有、表示、移動、削除をクリックするたびに4つのアクションを実行できるようにする必要がありますが、サムネイルパスだけではできません。すべて試しました。仕事:/。以下に私の実装のスニペットを示します。これに関するヘルプやガイダンスは非常に高く評価されます。 Androidがサムネイルから画像へのパスを取得していますか?

public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

    int columnIndex = 0; 
    String[] projection = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); 

    if(cursor != null){ 
     columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 

     cursor.moveToPosition(position); 
     imagePath = cursor.getString(columnIndex); 

     FileInputStream is = null; 
     BufferedInputStream bis = null; 

     try{ 
      is = new FileInputStream(new File(imagePath)); 
      bis = new BufferedInputStream(is); 
      Bitmap bitmap = BitmapFactory.decodeStream(bis); 
      useThisBitmap = Bitmap.createScaledBitmap(bitmap, parent.getWidth(), parent.getHeight(), true); 

      bitmap.recycle(); 
     }catch(Exception e){ 
      //Try to recover 
     } 
     finally{ 
      try{ 
       if(bis != null){ 
        bis.close(); 
       } 
       if(is != null){ 
        is.close(); 
       } 
       cursor.close(); 
       projection = null; 
      }catch(Exception e){ 

      } 
     } 
    } 
    Toast.makeText(this, " " + imagePath, Toast.LENGTH_SHORT).show(); 

は、これまでのところ私はIMAGEPATHメンバーを使用して、すべてを試してみたが、それは例外がスローされたか、他のエラーされますどちらか。助言がありますか?

答えて

3

解決策を見つけました。私がMediaStoreコンテンツリゾルバに問い合わせてサムネイルを取得する前に(私がとにかく必要なものではない)。この最適化により、私は同じ正確な方法でMediaStoreを検索できますが、今回はACTUAL Imagesを検索しています。サムネイルMICRO_KINDを返しています。その後、イメージはビットマップの配列にキャッシュされ、GridViewにデータを格納するために使用されます。私は今、デバイス上の実際のフルサイズのイメージへのパスを取得することができます。私はURIインスタンスまたはそのパスを使用してFileを作成する必要がある場合は、今すぐ簡単にできます。これまたは類似の問題Android getting path to image from Thumbnail?を持つ他の人には、以下の解決策コードがあります。 Btw、私はこれをAsyncTaskで行い、デバイス上のすべてのイメージが表示された後に読み込みダイアログを表示/非表示にします。

/*----------------------------ASYNC TASK TO LOAD THE PHOTOS--------------------------------------------------------*/ 

public class LoadPhotos extends AsyncTask<Object, Object, Object>{ 

    @Override 
    protected Object doInBackground(Object... params) { 
     final String[] columns = { MediaStore.Images.Media._ID }; 
     final String orderBy = MediaStore.Images.Media._ID; 

     Cursor imagecursor = managedQuery(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, 
       null, orderBy); 

     int image_column_index = imagecursor 
       .getColumnIndex(MediaStore.Images.Media._ID); 

     AllPhotosActivity.count = imagecursor.getCount(); 
     AllPhotosActivity.windows = new Bitmap[AllPhotosActivity.count]; 

     for (int i = 0; i < AllPhotosActivity.count; i++) { 
      imagecursor.moveToPosition(i); 
      //i = index; 
      int id = imagecursor.getInt(image_column_index); 
      windows[i] = MediaStore.Images.Thumbnails.getThumbnail(
        getApplicationContext().getContentResolver(), id, 
        MediaStore.Images.Thumbnails.MICRO_KIND, null); 
     } 

     imagecursor.close(); 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Object result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     pd.dismiss(); 
     imagegrid.setAdapter(new ImageAdapter(getApplicationContext())); 

    } 

    @Override 
    protected void onProgressUpdate(Object... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 



} 

そして、ここに私のonItemClick(だ) 「ファイル名」メンバーは、あなたがたURIまたは何あなたがイメージして行う必要があるのインスタンスを作成するために使用するものです。

public void onItemClick(AdapterView<?> arg0, android.view.View v, 
       int position, long id) { 
      String[] columns = { MediaStore.Images.Media.DATA, 
        MediaStore.Images.Media._ID }; 
      Cursor actualimagecursor = managedQuery(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, 
        null, null, null); 

      final int dataColumnIndex = actualimagecursor 
        .getColumnIndex(MediaStore.Images.Media.DATA); 
      final int idColumIndex = actualimagecursor 
        .getColumnIndex(MediaStore.Images.Media._ID); 

      actualimagecursor.moveToPosition(position); 

      filename = actualimagecursor.getString(dataColumnIndex); 
      final long imageId = actualimagecursor.getLong(idColumIndex); 
+0

あなたはgridviewのimageadapterに何を持っていますか? – jxgn

+0

このコードではありがとうございますが、選択したイメージの正確なパスが与えられていません。最初のイメージを選択すると、2番目のイメージのパスが与えられます。 – Prabs

+0

[this helped](http://stackoverflow.com/a/6548026/4361127) – Prabs

0
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null); 

このコードを使用するとうまくいくと思います。基本的には、サムネイルと元の画像の両方に同じIDです。そのため、サムネイルと画像の両方の位置は同じになります。

+0

私はあなたが何を意味しているか分かりません。ご覧のとおり、私はすでにあなたが投稿したコードを使用しています。より詳細な解決策をお願いします。 –

+0

あなたのコードを試しました。私はMediaStoreから無作為のUrisを取得していて、フルサイズの画像ではないので、うまくいきません。 –

関連する問題