2013-09-26 34 views
1

我想知道WhatsApp是否使用原生Android圖庫或其自定義圖庫。基本上這個畫廊允許用戶選擇多個圖像。但是,如果我要使用原生圖像庫,我似乎找不到任何方法來選擇多個圖像。知道Intent.ACTION_PICK是調用原生圖像庫的基本功能,但這允許用戶一次選擇一個圖像。由於WhatsApp允許用戶選擇多個圖像,我想找到一種方法來做同樣的事情。不知道這是否可以通過Intent.ACTION_SEND_MULTIPLE。任何幫助/建議?WhatsApp在分享圖像時使用本地圖庫

+0

類請檢查此鏈接。 http://stackoverflow.com/questions/3058922/select-multiple-images-using-galleryview 按照上述「畫廊小部件不支持默認多選」 – Amit

+0

您必須實現多選的自定義畫廊 –

回答

1

我已經創建了我的自定義庫來這樣做。

試試這個工作般的魅力

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.Toast; 


import com.ijoomer.src.R; 

/** 
* This Class Contains All Method Related To IjoomerPhotoGalaryActivity. 
* 
* @author tasol 
* 
*/ 
public class IjoomerPhotoGalaryActivity extends Activity { 

    private ImageAdapter imageAdapter; 

    private String[] arrPath; 
    private boolean[] thumbnailsselection; 
    private int ids[]; 
    private int count; 


    /** 
    * Overrides methods 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.photo_gallery); 

     final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }; 
     final String orderBy = MediaStore.Images.Media._ID; 
     @SuppressWarnings("deprecation") 
     Cursor imagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); 
     int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID); 
     this.count = imagecursor.getCount(); 
     this.arrPath = new String[this.count]; 
     ids = new int[count]; 
     this.thumbnailsselection = new boolean[this.count]; 
     for (int i = 0; i < this.count; i++) { 
      imagecursor.moveToPosition(i); 
      ids[i] = imagecursor.getInt(image_column_index); 
      int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); 
      arrPath[i] = imagecursor.getString(dataColumnIndex); 
     } 
     GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid); 
     imageAdapter = new ImageAdapter(); 
     imagegrid.setAdapter(imageAdapter); 
     imagecursor.close(); 

     final Button selectBtn = (Button) findViewById(R.id.selectBtn); 
     selectBtn.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       final int len = thumbnailsselection.length; 
       int cnt = 0; 
       String selectImages = ""; 
       for (int i = 0; i < len; i++) { 
        if (thumbnailsselection[i]) { 
         cnt++; 
         selectImages = selectImages + arrPath[i] + "|"; 
        } 
       } 
       if (cnt == 0) { 
        Toast.makeText(getApplicationContext(), "Please select at least one image", Toast.LENGTH_LONG).show(); 
       } else { 

        Log.d("SelectedImages", selectImages); 
        Intent i = new Intent(); 
        i.putExtra("data", selectImages); 
        setResult(Activity.RESULT_OK, i); 
        finish(); 
       } 
      } 
     }); 
    } 
    @Override 
    public void onBackPressed() { 
     setResult(Activity.RESULT_CANCELED); 
     super.onBackPressed(); 

    } 

    /** 
    * Class method 
    */ 

    /** 
    * This method used to set bitmap. 
    * @param iv represented ImageView 
    * @param id represented id 
    */ 

    private void setBitmap(final ImageView iv, final int id) { 

     new AsyncTask<Void, Void, Bitmap>() { 

      @Override 
      protected Bitmap doInBackground(Void... params) { 

       return MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null); 
      } 

      @Override 
      protected void onPostExecute(Bitmap result) { 
       super.onPostExecute(result); 
       iv.setImageBitmap(result); 
      } 
     }.execute(); 
    } 


    /** 
    * List adapter 
    * @author tasol 
    */ 

    public class ImageAdapter extends BaseAdapter { 
     private LayoutInflater mInflater; 

     public ImageAdapter() { 
      mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     public int getCount() { 
      return count; 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = mInflater.inflate(R.layout.photo_gallery_item, null); 
       holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage); 
       holder.IjoomerCheckBox = (IjoomerCheckBox) convertView.findViewById(R.id.itemCheckBox); 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.IjoomerCheckBox.setId(position); 
      holder.imageview.setId(position); 
      holder.IjoomerCheckBox.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        IjoomerCheckBox cb = (IjoomerCheckBox) v; 
        int id = cb.getId(); 
        if (thumbnailsselection[id]) { 
         cb.setChecked(false); 
         thumbnailsselection[id] = false; 
        } else { 
         cb.setChecked(true); 
         thumbnailsselection[id] = true; 
        } 
       } 
      }); 
      holder.imageview.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        int id = holder.IjoomerCheckBox.getId(); 
        if (thumbnailsselection[id]) { 
         holder.IjoomerCheckBox.setChecked(false); 
         thumbnailsselection[id] = false; 
        } else { 
         holder.IjoomerCheckBox.setChecked(true); 
         thumbnailsselection[id] = true; 
        } 
       } 
      }); 
      try { 
       setBitmap(holder.imageview, ids[position]); 
      } catch (Throwable e) { 
      } 
      holder.IjoomerCheckBox.setChecked(thumbnailsselection[position]); 
      holder.id = position; 
      return convertView; 
     } 
    } 


    /** 
    * Inner class 
    * @author tasol 
    */ 
    class ViewHolder { 
     ImageView imageview; 
     IjoomerCheckBox IjoomerCheckBox; 
     int id; 
    } 

} 

photo_gallery.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
    <Button android:id="@+id/selectBtn" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:text="Select" android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:minWidth="200px" /> 
    <GridView android:id="@+id/PhoneImageGrid" 
     android:layout_width="match_parent" android:layout_height="match_parent" 
     android:numColumns="auto_fit" android:verticalSpacing="10dp" 
     android:horizontalSpacing="10dp" android:columnWidth="90dp" 
     android:stretchMode="columnWidth" android:gravity="center" 
     android:layout_above="@id/selectBtn" /> 
</RelativeLayout> 

photo_gallery_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
    <ImageView android:id="@+id/thumbImage" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:layout_centerInParent="true" 
     /> 
    <CheckBox android:id="@+id/itemCheckBox" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" /> 
</RelativeLayout> 
+0

whr是複選框? –

相關問題