0
我想開始選擇多張圖像的意圖。 例如,當意圖將您引用到圖庫中以挑選圖像時,您只需長按一下,然後選擇幾張圖像即可。我想獲取此圖像的URI。 我該怎麼做? 感謝幫手如何從意圖獲取多張照片
我想開始選擇多張圖像的意圖。 例如,當意圖將您引用到圖庫中以挑選圖像時,您只需長按一下,然後選擇幾張圖像即可。我想獲取此圖像的URI。 我該怎麼做? 感謝幫手如何從意圖獲取多張照片
沒有默認的方式來做到這一點。 下面是我在我的項目創造了一個活動:
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
意圖true
或false
需要多個/單選擇模式可以指定。這段代碼將是一個非常好的開始。
謝謝你的回答,但我沒有太多的瞭解,你能解釋一下嗎? – user3225147
@ user3225147您是否至少嘗試過使用此代碼? – Lingviston
我正嘗試將其與我的應用相匹配,很快就會在此處更新,謝謝。 – user3225147