Android 照片选择器

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值