2014-04-09 63 views
0

我想開始選擇多張圖像的意圖。 例如,當意圖將您引用到圖庫中以挑選圖像時,您只需長按一下,然後選擇幾張圖像即可。我想獲取此圖像的URI。 我該怎麼做? 感謝幫手如何從意圖獲取多張照片

回答

0

沒有默認的方式來做到這一點。 下面是我在我的項目創造了一個活動:

public class GalleryActivity extends AtionbarActivity { 
    // ----------------------------------------------------------------------- 
    // 
    // Constants 
    // 
    // ----------------------------------------------------------------------- 
    public static final String EXTRA_SELECTED_ITEMS = "EXTRA_SELECTED_ITEMS"; 
    public static final String EXTRA_SELECT_MODE_SINGLE = "EXTRA_SELECT_MODE_SINGLE"; 
    // ----------------------------------------------------------------------- 
    // 
    // Fields 
    // 
    // ----------------------------------------------------------------------- 
    private GridView mGridView; 

    private GalleryAdapter mAdapter; 

    private boolean mSelectSingle = false; 

    // ----------------------------------------------------------------------- 
    // 
    // Methods 
    // 
    // ----------------------------------------------------------------------- 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_gallery); 

     mSelectSingle = getIntent().getBooleanExtra(EXTRA_SELECT_MODE_SINGLE, 
       false); 

     findViews(); 
     initViews(); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    private void findViews() { 
     mGridView = (GridView) findViewById(R.id.activity_gallery_gridview); 
    } 

    private void initViews() { 
     mAdapter = new GalleryAdapter(this, R.layout.grid_item_gallery_image, 
       mSelectSingle); 
     mGridView.setAdapter(mAdapter); 

     mGridView.setOnItemClickListener(mImageClickListener); 
    } 

    private void updateGrid() { 
     Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
     String[] projection = { MediaStore.Images.Media.DATA, 
       MediaStore.Images.Media.DATE_TAKEN, 
       MediaStore.Images.Media.LATITUDE, 
       MediaStore.Images.Media.LONGITUDE }; 
     Cursor cursor = getContentResolver().query(uri, projection, null, null, 
       null); 

     ArrayList<GalleryImage> list = new ArrayList<GalleryImage>(); 
     if (cursor.moveToFirst()) 
      while (cursor.moveToNext()) { 
       GalleryImage image = new GalleryImage(); 
       int columnIndex = cursor 
         .getColumnIndex(MediaStore.Images.Media.DATA); 
       image.path = cursor.getString(columnIndex); 

       columnIndex = cursor 
         .getColumnIndex(MediaStore.Images.Media.DATE_TAKEN); 
       image.date = new Date(cursor.getLong(columnIndex)); 

       columnIndex = cursor 
         .getColumnIndex(MediaStore.Images.Media.LATITUDE); 
       image.lat = cursor.getDouble(columnIndex); 

       columnIndex = cursor 
         .getColumnIndex(MediaStore.Images.Media.LONGITUDE); 
       image.lng = cursor.getDouble(columnIndex); 

       list.add(image); 
      } 
     mAdapter.setItems(list); 
     cursor.close(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     mAdapter.onSaveInstanceState(outState); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     mAdapter.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     updateGrid(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.gallery_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      return true; 
     case R.id.menu_confirm: 
      Intent intent = new Intent(); 
      intent.putExtra(EXTRA_SELECTED_ITEMS, mAdapter.getSelectedItems()); 
      setResult(RESULT_OK, intent); 
      finish(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    // ----------------------------------------------------------------------- 
    // 
    // Listeners 
    // 
    // ----------------------------------------------------------------------- 

    private OnItemClickListener mImageClickListener = new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      mAdapter.applySelection(arg2); 
     } 
    }; 
} 

適配器我使用(你可以創建自己的):

public class GalleryAdapter extends BaseAdapter { 
    // ----------------------------------------------------------------------- 
    // 
    // Constants 
    // 
    // ----------------------------------------------------------------------- 
    private static final String EXTRA_SELECTED_ITEMS = "EXTRA_SELECTED_ITEMS"; 

    // ----------------------------------------------------------------------- 
    // 
    // Fields 
    // 
    // ----------------------------------------------------------------------- 
    private ArrayList<GalleryImage> mItems; 
    private ArrayList<GalleryImage> mSelectedItems; 
    private LayoutInflater mInflater; 
    private int mResId; 
    private boolean mSelectSingle; 

    // ----------------------------------------------------------------------- 
    // 
    // Constructor 
    // 
    // ----------------------------------------------------------------------- 
    public GalleryAdapter(Context context, int resource, boolean selectMode) { 
     mResId = resource; 
     mItems = new ArrayList<GalleryImage>(); 
     mSelectedItems = new ArrayList<GalleryImage>(); 
     mSelectSingle = selectMode; 

     mInflater = LayoutInflater.from(context); 
    } 

    // ----------------------------------------------------------------------- 
    // 
    // Methods 
    // 
    // ----------------------------------------------------------------------- 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     GalleryImage item = (GalleryImage) getItem(position); 
     if (convertView == null) 
      convertView = mInflater.inflate(mResId, parent, false); 

     ImageView thumbnail = (ImageView) ViewHolder.get(convertView, 
       R.id.grid_item_gallery_image); 
     String thumbTag = (String) thumbnail.getTag(); 
     if (thumbTag == null || !thumbTag.equals(item.path)) 
      ImageManager.displayImage("file:/" + item.path, thumbnail); 
     thumbnail.setTag(item.path); 

     ImageView selection = (ImageView) ViewHolder.get(convertView, 
       R.id.grid_item_gallery_selection); 
     selection.setVisibility(mSelectedItems.contains(item) ? View.VISIBLE 
       : View.GONE); 

     return convertView; 
    } 

    public void setItems(ArrayList<GalleryImage> items) { 
     mItems = items; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mItems.size(); 
    } 

    @Override 
    public Object getItem(int index) { 
     return mItems.get(index); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    public void applySelection(int position) { 
     GalleryImage image = mItems.get(position); 
     if (mSelectSingle) 
      mSelectedItems.clear(); 
     if (!mSelectedItems.contains(image)) 
      mSelectedItems.add(image); 
     else 
      mSelectedItems.remove(image); 
     notifyDataSetChanged(); 
    } 

    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     mSelectedItems = savedInstanceState 
       .getParcelableArrayList(EXTRA_SELECTED_ITEMS); 
     notifyDataSetChanged(); 
    } 

    public void onSaveInstanceState(Bundle outState) { 
     outState.putParcelableArrayList(EXTRA_SELECTED_ITEMS, mSelectedItems); 
    } 

    public ArrayList<GalleryImage> getSelectedItems() { 
     return mSelectedItems; 
    } 
} 

,我用它來存儲圖像數據的結構:

public class GalleryImage implements Parcelable { 
    public String path; 
    public Date date; 
    public double lat; 
    public double lng; 

    public GalleryImage() { 

    } 

    public GalleryImage(String path, Date date, double lat, double lng) { 
     this.path = path; 
     this.date = date; 
     this.lat = lat; 
     this.lng = lng; 
    } 

    public GalleryImage(Parcel in) { 
     this.path = in.readString(); 
     this.date = new Date(in.readLong()); 
     this.lat = in.readDouble(); 
     this.lng = in.readDouble(); 
    } 

    @Override 
    public boolean equals(Object o) { 
     return ((GalleryImage) o).path.equals(path); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(path); 
     dest.writeLong(date.getTime()); 
     dest.writeDouble(lat); 
     dest.writeDouble(lng); 
    } 

    public static final Parcelable.Creator<GalleryImage> CREATOR = new Parcelable.Creator<GalleryImage>() { 
     public GalleryImage createFromParcel(Parcel in) { 
      return new GalleryImage(in); 
     } 

     public GalleryImage[] newArray(int size) { 
      return new GalleryImage[size]; 
     } 
    }; 
} 

,如果你通過設置您EXTRA_SELECT_MODE_SINGLE意圖truefalse需要多個/單選擇模式可以指定。這段代碼將是一個非常好的開始。

+0

謝謝你的回答,但我沒有太多的瞭解,你能解釋一下嗎? – user3225147

+0

@ user3225147您是否至少嘗試過使用此代碼? – Lingviston

+0

我正嘗試將其與我的應用相匹配,很快就會在此處更新,謝謝。 – user3225147