从图库获取照片并实现裁剪功能

主界面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="fdata.choosepicturesfromstorage.MainActivity">

    <ImageView
        android:id="@+id/iv"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#666666"/>

</LinearLayout>

public class MainActivity extends AppCompatActivity {

    private ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv= (ImageView) findViewById(R.id.iv);
        iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showGetPicFragment();
            }
        });
    }


    private GetPicFragment dialog;

    private void showGetPicFragment() {
        if (null == dialog) {
            dialog = new GetPicFragment();
            dialog.setOnGetPicListener(new GetPicFragment.OnGetPicListener() {
                @Override
                public void onResult(Uri uri) {
                    iv.setImageURI(uri);
                }
            });
        }
        dialog.show(getSupportFragmentManager(), "get_pic");
    }
}

碎片
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="fdata.choosepicturesfromstorage.GetPicFragment">

    <Button
        android:id="@+id/choose_picture"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="从图库中选择图片"
        android:textSize="20sp"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="拍照"
        android:textSize="20sp"
        android:layout_marginTop="10dp"/>

</LinearLayout>

public class GetPicFragment extends DialogFragment implements View.OnClickListener {
    //裁剪之后的图像地址
    private Uri uriResult;
    //拍照之后的地址
    private Uri uriTakePic;
    //从图库获取
    private static final int REQUST_GET_FROM_STORAGE = 1;
    //裁剪
    private static final int REQUST_CROP = 2;
    //拍照
    private static final int REQUST_TAKE_PIC = 3;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_get_pic, container, false);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setCancelable(true);
        setStyle(STYLE_NO_TITLE, 0);
        //getActivity().getExternalCacheDir() ==> /mnt/sdcard/Android/data/应用包名/cache/124545454.jpg
        // file:///mnt/sdcard/Android/data/应用包名/cache/124545454.jpg
        uriResult = Uri.fromFile(new File(getActivity().getExternalCacheDir().toString() + "/" + System.currentTimeMillis() + ".jpg"));
        uriTakePic = Uri.fromFile(new File(getActivity().getExternalCacheDir().toString() + "/temp.jpg"));
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.findViewById(R.id.choose_picture).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.choose_picture:
                //从图库获取
                Intent it = new Intent(Intent.ACTION_GET_CONTENT);
                it.setType("image/*");
                it.addCategory(Intent.CATEGORY_OPENABLE);
                //不要返回图像对象
                it.putExtra("return-data", false);
                startActivityForResult(it, REQUST_GET_FROM_STORAGE);
                break;
            case R.id.take_photo:
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT,uriTakePic);
                startActivityForResult(intent,REQUST_TAKE_PIC);
                break;
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
                case REQUST_GET_FROM_STORAGE:
                    Uri uri = data.getData();
                    //  content://com.android.provider.media.documents/document/image:123
                    //  content://com.android.dddd/122
                    // file:///
                    String path = getPath(uri);
                   startZoom(Uri.fromFile(new File(path)));
                    break;
                case REQUST_CROP:
                    if(null != onGetPicListener){
                        onGetPicListener.onResult(uriResult);
                    }
                    dismiss();
                    break;
                case REQUST_TAKE_PIC:
                    startZoom(uriTakePic);
                    break;
            }
        }
    }

    /**
     * 启动裁剪界面
     * @param uri
     */
    private void startZoom(Uri uri){
        Intent it = new Intent("com.android.camera.action.CROP");
        it.setDataAndType(uri,"image/*");
        //设置裁剪的宽高比
        it.putExtra("aspectX",1);
        it.putExtra("aspectY",1);
        //设置裁剪之后的输出地址
        it.putExtra(MediaStore.EXTRA_OUTPUT,uriResult);
        it.putExtra("return-data", false);
        it.putExtra("outputFormat", "JPEG");
        startActivityForResult(it,REQUST_CROP);
    }

    //获取图像的uri对应的物理地址(存在磁盘中的地址)
    private String getPath(Uri uri) {
        String path = "";
        //4.4以上版本的地址为content://com.android.provider.media.documents/document/image%3A123
        if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(getActivity(), uri)) {
            //从地址中获取id信息---> image:35
            String idStr = DocumentsContract.getDocumentId(uri);
            //获取id内容  image:35-->35
            String id = idStr.split(":")[1];
            //组装条件查询
            String[] col = {MediaStore.Images.Media.DATA};
            Cursor c = getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    col, MediaStore.Images.Media._ID + "=?", new String[]{id}, null);
            if (c.moveToFirst()) {
                path = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            c.close();
        } else if("content".equalsIgnoreCase(uri.getScheme())){
            String[] col = {MediaStore.Images.Media.DATA};
            Cursor c = getActivity().getContentResolver().query(uri, col, null, null, null);
            if (c.moveToFirst()) {
                path = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            c.close();
        }else{
            // file:///
            path = uri.getPath();
        }
        return path;
    }


    public interface OnGetPicListener{
        void onResult(Uri uri);
    }

    public OnGetPicListener getOnGetPicListener() {
        return onGetPicListener;
    }

    public void setOnGetPicListener(OnGetPicListener onGetPicListener) {
        this.onGetPicListener = onGetPicListener;
    }

    private OnGetPicListener onGetPicListener;
}

注意一定要在mainfest中设置使用权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值