1. 支持 相册/相机
2. Nexus6P 测试通过
3. OOM需要缩小图片大小就可以解决
4. 本案例图片加载框架用的XUtil,自行替换为喜欢的吧。
5. 具体情况,自行修改吧。 此处就不多言了
代码如下
public class ImagePickerActivity extends AppCompatActivity implements View.OnClickListener {
public static final int REQUEST_CODE = 100;
@ViewInject(R.id.imagesLayout)
private RecyclerView mImagesLayout;
ImageAdapter mAdapter;
private List<MediaEntity> imageDatas = new ArrayList<MediaEntity>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_picker);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("选择照片");
x.view().inject(this);
mImagesLayout.setLayoutManager(new GridLayoutManager(this, 3));
mAdapter = new ImageAdapter();
DisplayMetrics out = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(out);
mImagesLayout.addItemDecoration(new SpaceItemDecoration((int) (out.widthPixels * 0.01f)));
mImagesLayout.setAdapter(mAdapter);
new Thread(new ImagePickerThread(this, new ImageLoadListener() {
@Override
public void onLoadSuccess(List<MediaEntity> datas) {
imageDatas = datas;
imageDatas.add(0,new MediaEntity("", "assets://icon_camera.png", System.currentTimeMillis()));
mAdapter.notifyDataSetChanged();
}
})).start();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imagepicker_centerimg:
String path = (String) v.getTag();
if (path.startsWith("assets")) {
//点击了照相机
camera(this);
} else {
//点击了照片
App.log("点击了照片: "+path);
Intent data = new Intent();
data.putExtra("picPath",path);
data.putExtra("index",3);
setResult(REQUEST_CODE,data);
finish();
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE)
{
if(!TextUtils.isEmpty(imgPath))
{
try {
File file = new File(imgPath);
if(file.exists())
{
Intent d = new Intent();
d.putExtra("picPath",imgPath);
d.putExtra("index",3);
setResult(REQUEST_CODE,d);
finish();
}
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
if(imgPath != null)
{
App.log("图片选择器 保存拍照路径");
outState.putString("imgPath",imgPath);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String imgPath = savedInstanceState.getString("imgPath");
App.log("图片选择器 恢复图片路径 "+imgPath);
}
class ImageAdapter extends RecyclerView.Adapter<ImageHolder> {
ImageOptions options = new ImageOptions.Builder().setSize(100, 100).build();
@Override
public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ImageHolder imageHolder = new ImageHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.image_container,
parent, false));
imageHolder.imageView.setOnClickListener(ImagePickerActivity.this);
return imageHolder;
}
@Override
public void onBindViewHolder(ImageHolder holder, int position) {
x.image().bind(holder.imageView, imageDatas.get(position).getPath(), options);
holder.imageView.setTag(imageDatas.get(position).getPath());
}
@Override
public int getItemCount() {
return imageDatas.size();
}
}
static class ImageHolder extends RecyclerView.ViewHolder {
ImageView imageView;
public ImageHolder(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.imagepicker_centerimg);
}
}
static class MediaEntity {
private String name;
private String path;
private long createTime;
public MediaEntity() {
}
public MediaEntity(String name, String path, long createTime) {
this.name = name;
this.path = path;
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
}
static class ImagePickerThread implements Runnable {
private WeakReference<Context> context;
private Cursor cursor;
ImageLoadListener mListener;
public ImagePickerThread(Context ctx, ImageLoadListener listener) {
context = new WeakReference<Context>(ctx);
this.mListener = listener;
}
@Override
public void run() {
if (context.get() != null) {
String columns[] = new String[]{Media.DATA, Media._ID, Media.TITLE,
Media.DISPLAY_NAME, Media.DATE_TAKEN};
cursor = context.get().getContentResolver().query(Media.EXTERNAL_CONTENT_URI,
columns, null, null, null);
if (cursor == null) {
return;
}
int mImagePathColumnIndex = cursor.getColumnIndexOrThrow(Media.DATA);
int mImageNameColumnIndex = cursor
.getColumnIndexOrThrow(Media.DISPLAY_NAME);
int mImageCreateTimeColumnIndex = cursor
.getColumnIndexOrThrow(Media.DATE_TAKEN);
ArrayList<MediaEntity> tmpList = new ArrayList<MediaEntity>();
if (cursor.moveToFirst()) {
do {
String path = cursor.getString(mImagePathColumnIndex);
String name = cursor.getString(mImageNameColumnIndex);
long createTime = cursor.getLong(mImageCreateTimeColumnIndex);
MediaEntity entity = new MediaEntity(name, path, createTime);
tmpList.add(entity);
} while (cursor.moveToNext());
Collections.sort(tmpList, new Comparator<MediaEntity>() {
@Override
public int compare(MediaEntity lhs, MediaEntity rhs) {
return (int) (rhs.createTime - lhs.createTime);
}
});
}
if (mListener != null) {
mListener.onLoadSuccess(tmpList);
}
}
}
}
static interface ImageLoadListener {
public void onLoadSuccess(List<MediaEntity> datas);
}
class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpaceItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.bottom = space;
outRect.top = space;
outRect.right = space;
outRect.left = space;
}
}
//相机拍照
public void camera(Activity context) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri outputMediaFileUri = getOutputMediaFileUri(1);
imgPath = outputMediaFileUri.getEncodedPath();
if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputMediaFileUri);
context.startActivityForResult(intent, TAKE_BIG_IMAGE);
} else {
Toast.makeText(ImagePickerActivity.this, "未检测到存储设备!", Toast.LENGTH_SHORT).show();
}
}
private static Uri getOutputMediaFileUri(int type) {
return Uri.fromFile(getOutputMediaFile());
}
private static File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
return mediaFile;
}
private boolean hasSdcard() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
public interface OnImagePathCreatedListener {
void onPathCreated(Uri uri);
}
public static final int TAKE_BIG_IMAGE = 100;
String imgPath;
}