2012-02-14 34 views
5

Tôi đang cố gắng phát hành bản cập nhật quan trọng cho ứng dụng của mình hiện có trên thị trường. Tôi cần truy vấn các hình thu nhỏ trong MediaStore và tải các hình thu nhỏ vào GridView. Cho đến nay rất tốt, bây giờ tôi chỉ cần có được con đường của hình ảnh fullsized thực tế trên lưu trữ bên ngoài của người dùng chỉ dựa trên những gì tôi có (đó là đường dẫn đến hình thu nhỏ). Tôi cần có thể thực hiện 4 tác vụ mỗi khi người dùng nhấp vào hình thu nhỏ, Chia sẻ, Xem, Di chuyển và Xóa ... nhưng tôi không thể thực hiện bất kỳ thao tác nào trong số này chỉ với đường dẫn hình thu nhỏ, tôi đã thử mọi thứ, không công việc :/. Dưới đây là một đoạn thực hiện của tôi dưới đây, bất kỳ trợ giúp hoặc hướng dẫn về điều này sẽ được đánh giá rất nhiều!Android nhận đường dẫn đến hình ảnh từ Hình thu nhỏ?

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(); 

Cho đến nay tôi đã thử mọi thứ bằng cách sử dụng thành viên imagePath, nhưng điều đó khiến cho các ngoại lệ bị ném hoặc các lỗi khác. Bất kỳ đề xuất?

Trả lời

3

Tôi đã tìm thấy giải pháp. Trước khi tôi truy vấn MediaStore Content Resolver và lấy Thumbnail (không phải những gì tôi cần). Tối ưu hóa này cho phép tôi tìm kiếm MediaStore theo cùng một cách chính xác, nhưng lần này tôi đang tìm kiếm hình ảnh ACTUAL và tôi trả lại hình thu nhỏ MICRO_KIND. Các hình ảnh sau đó được lưu trữ trong một mảng các Bitmap và sau đó được sử dụng để cư trú trong GridView. Bây giờ tôi có thể nhận được đường dẫn đến hình ảnh kích thước thực, đầy đủ trên thiết bị .. trong trường hợp tôi cần phải tạo một cá thể URI hoặc một Tệp bằng cách sử dụng đường dẫn đó, bây giờ tôi có thể dễ dàng. Đối với bất kỳ ai khác có vấn đề này hoặc một vấn đề tương tự Android getting path to image from Thumbnail?, đây là mã giải pháp bên dưới. Btw, tôi đang làm điều này trong một AsyncTask và hiển thị/loại bỏ một hộp thoại tải sau khi tất cả hình ảnh trên thiết bị đã được hiển thị.

/*----------------------------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); 
    } 



} 

Và đây là onItemClick của tôi() Các "filename" thành viên là những gì bạn sẽ sử dụng để tạo ra các trường hợp của URI hoặc bất cứ điều gì bạn cần phải làm với các hình ảnh.

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

những gì bạn có trong imageadapter cho GridView ??? – jxgn

+0

Cảm ơn bạn rất nhiều vì mã này, nhưng nó không đưa ra đường dẫn chính xác của hình ảnh được chọn. Khi chọn hình ảnh thứ nhất, nó sẽ cho đường dẫn của hình ảnh thứ 2. – Prabs

+0

[điều này đã giúp] (http://stackoverflow.com/a/6548026/4361127) – Prabs

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

sử dụng mã này, tôi nghĩ nó sẽ hoạt động. Về cơ bản nó là cùng một id cho cả hình thu nhỏ và hình ảnh gốc, do đó vị trí cho cả hình thu nhỏ và hình ảnh sẽ giống nhau.

+0

Tôi không chắc mình hiểu ý của bạn là gì. Như bạn có thể thấy tôi đã sử dụng mã bạn đã đăng. Một giải pháp chi tiết hơn xin vui lòng. –

+0

Tôi đã thử mã của bạn. Nó không hoạt động, như tôi nhận được ngẫu nhiên Uris từ MediaStore và không phải là một cho hình ảnh fullsize –

Các vấn đề liên quan