主界面:
<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"/>