弹出对话框选择相机或者图库内的图片

来源:互联网 发布:tinyumbrella官网 mac 编辑:程序博客网 时间:2024/06/03 15:58
private static final int CAMERA 100;
private static final int PICTURE 200;
加入动态权限
public static boolean isGrantExternalRW(Activity activity) {//获取动态权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.&& activity.checkSelfPermission(
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        activity.requestPermissions(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        }, 1);
        return false;
    }
    return true;
}
点击事件中弹出对话框

new AlertDialog.Builder(this)
        .setTitle("选择来源")
        .setItems(new String[]{"拍照""图库"}, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0://拍照
                       //打开系统拍照程序,选择拍照图片
                        Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(camera, CAMERA);
                        break;
                    case 1://图库
                       //打开系统图库程序,选择图片
                        Intent picture = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(picture, PICTURE);
                        break;
                }
            }
        })
        .show();


   //Bimap:对应图片在内存中的对象
    //掌握:存储--->内存:BitmapFactory.decodeFile(String filePath)
    //                  BitmapFactory.decodeStream(InputStream is)
    //     内存--->存储:bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStream os);
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //可以考虑的存储路径:手机内部:context.getFilesDir():data/data/包名/files
        //手机外部:路径1context.getExternalFilesDir():storage/sdcard/android/data/包名/files
        //路径2Environment.getExternalStorageDirectory():storage/sdcard
//        String path = this.getCacheDir() + "/tx.png";
//        Log.e("TAG", "path = " + path);

        if (requestCode == CAMERA && resultCode == RESULT_OK && data != null) {
            //拍照
            Bundle bundle = data.getExtras();
            // 获取相机返回的数据,并转换为图片格式
            Bitmap bitmap = (Bitmap) bundle.get("data");
            //bitmap圆形裁剪
            bitmap = BitmapUtils.zoom(bitmap, UIUtils.dp2px(62), UIUtils.dp2px(62));
            Bitmap circleImage = BitmapUtils.circleBitmap(bitmap);


            //真是项目当中,是需要上传到服务器的..这步我们就不做了。
           imageView1.setImageBitmap(circleImage);
            //将图片保存在本地
            saveImage(circleImage);

        } else if (requestCode == PICTURE && resultCode == RESULT_OK && data != null) {
            //图库
            Uri selectedImage = data.getData();
            //这里返回的uri情况就有点多了
           //**:4.4.2之前返回的uri:content://media/external/images/media/3951或者file://....4.4.2返回的是content://com.android.providers.media.documents/document/image:3951或者
           //总结:uri的组成,eg:content://com.example.project:200/folder/subfolder/etc
            //content:--->"scheme"
            //com.example.project:200-->"host":"port"--->"authority"[主机地址+端口(省略) =authority]
            //folder/subfolder/etc-->"path" 路径部分
           //android各个不同的系统版本,对于获取外部存储上的资源,返回的Uri对象都可能各不一样,所以要保证无论是哪个系统版本都能正确获取到图片资源的话
           //就需要针对各种情况进行一个处理了
            String pathResult = getPath(selectedImage);

            Bitmap decodeFile = BitmapFactory.decodeFile(pathResult);
            Bitmap zoomBitmap = BitmapUtils.zoom(decodeFile, UIUtils.dp2px(62), UIUtils.dp2px(62));
            //bitmap圆形裁剪p
            Bitmap circleImage = BitmapUtils.circleBitmap(zoomBitmap);
            //真是项目当中,是需要上传到服务器的..这步我们就不做了。
           imageView1.setImageBitmap(circleImage);
            //保存图片到本地
            saveImage(circleImage);


        }

    }

    //保存图片的方法
    public void saveImage(Bitmap bitmap) {
        String path = this.getCacheDir() + "/tx.png";
        Log.e("TAG""path = " + path);
        try {
            FileOutputStream fos = new FileOutputStream(path);
            //bitmap压缩(压缩格式、质量、压缩文件保存的位置)
            bitmap.compress(Bitmap.CompressFormat.PNG100, fos);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
此处有不该加入的代码
    @OnClick(R.id.iv_top_back)
    public void back(View view){
        //销毁当前的activity
        removeCurrentActivity();
    }
退出登录
    @OnClick(R.id.loginout)
    public void logout(View view){
        //1.清空本地存储的用户数据:sp存储中保存的用户信息。本地用户头像
       //1.1sp存储中保存的用户信息的清除
        SharedPreferences sp = this.getSharedPreferences("user_info", Context.MODE_PRIVATE);
        sp.edit().clear().commit();//清空sp存储的数据。(user_info.xml仍然存在,但是内部没有数据)
       //2.本地用户头像文件的删除
        String filePath = this.getCacheDir() + "/tx.png";
        File file = new File(filePath);
        if(file.exists()){
            file.delete();
        }
        //2.结束当前Activity的显示
       this.removeAll();
        this.goToActivity(MainActivity.class,null);
    }


    /**
     * 根据系统相册选择的文件获取路径
     *
     * @param uri
     */
    @SuppressLint("NewApi")
    private String getPath(Uri uri) {
        int sdkVersion = Build.VERSION.SDK_INT;
        //高于4.4.2的版本
       if (sdkVersion >= 19) {
            Log.e("TAG""uri auth: " + uri.getAuthority());
            if (isExternalStorageDocument(uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                String[] split = docId.split(":");
                String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(this, contentUri, nullnull);
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(this, contentUri, selection, selectionArgs);
            } else if (isMedia(uri)) {
                String[] proj = {MediaStore.Images.Media.DATA};
                Cursor actualimagecursor = this.managedQuery(uri, proj, nullnullnull);
                int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                actualimagecursor.moveToFirst();
                return actualimagecursor.getString(actual_image_column_index);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(this, uri, nullnull);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    /**
     * uri路径查询字段
     *
     * @param context
     @param uri
     @param selection
     @param selectionArgs
     @return
     */
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    private boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static boolean isMedia(Uri uri) {
        return "media".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }


别处加入的代码
@Override
public void onResume() {
    super.onResume();

    String filePath = this.getActivity().getCacheDir() + "/tx.png";
    File file = new File(filePath);
    if(file.exists()){//如果存在
       //存储--->内存
        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
        imageView1.setImageBitmap(bitmap);
    }
}
1 0
原创粉丝点击