• Android 6.0及以上版本如何实现从图库中选取图片和拍照功能


    XML 代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="takePhone"
            android:text="拍照"
            />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="choosePhone"
            android:text="相册选择"
            />
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </LinearLayout>

    JAVA 代码:

    public class MainActivity extends AppCompatActivity {
        private ImageView imageView;
        private static final int CROP_PHOTO = 2;
        private static final int REQUEST_CODE_PICK_IMAGE=3;
        private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 6;
        private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE2 = 7;
        private File output;
        private Uri imageUri;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initView();
        }
    
        void initView(){
    
            imageView=(ImageView)findViewById(R.id.image);
        }
    
        public void takePhone(View view){
    
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CALL_PHONE2);
    
            }else {
    
                takePhoto();
            }
        }
    
        public void choosePhone(View view){
    
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CALL_PHONE2);
    
            }else {
    
                choosePhoto();
            }
        }
    
        /**
         * 拍照
         */
        void takePhoto(){
            /**
             * 最后一个参数是文件夹的名称,可以随便起
             */
            File file=new File(Environment.getExternalStorageDirectory(),"拍照");
    
            if(!file.exists()){
    
                file.mkdir();
            }
            /**
             * 这里将时间作为不同照片的名称
             */
            output=new File(file,System.currentTimeMillis()+".jpg");
    
            /**
             * 如果该文件夹已经存在,则删除它,否则创建一个
             */
            try {
                if (output.exists()) {
    
                    output.delete();
                }
                output.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }
            /**
             * 隐式打开拍照的Activity,并且传入CROP_PHOTO常量作为拍照结束后回调的标志
             */
            imageUri = Uri.fromFile(output);
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(intent, CROP_PHOTO);
    
        }
    
        /**
         * 从相册选取图片
         */
        void choosePhoto(){
            /**
             * 打开选择图片的界面
             */
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");//相片类型
            startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
    
        }
    
        public void onActivityResult(int req, int res, Intent data) {
            switch (req) {
                /**
                 * 拍照的请求标志
                 */
                case CROP_PHOTO:
                    if (res==RESULT_OK) {
                        try {
                            /**
                             * 该uri就是照片文件夹对应的uri
                             */
                            Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                            imageView.setImageBitmap(bit);
    
                        } catch (Exception e) {
    
                            Toast.makeText(this,"程序崩溃",Toast.LENGTH_SHORT).show();
                        }
                    }
                    else{
    
                    }
    
                    break;
                /**
                 * 从相册中选取图片的请求标志
                 */
    
                case REQUEST_CODE_PICK_IMAGE:
                    if (res == RESULT_OK) {
                        try {
                            /**
                             * 该uri是上一个Activity返回的
                             */
                            Uri uri = data.getData();
                            Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
                            imageView.setImageBitmap(bit);
                        } catch (Exception e) {
    
                            e.printStackTrace();
                            Toast.makeText(this,"程序崩溃",Toast.LENGTH_SHORT).show();
                        }
                    }
                    else{
    
                    }
                    break;
    
                default:
                    break;
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
        {
    
            if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE)
            {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    takePhoto();
    
                } else
                {
                    Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
                }
            }
    
    
            if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE2)
            {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    choosePhoto();
    
                } else
                {
                    Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
                }
            }
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }


  • 相关阅读:
    Azure Pipelines —— 资料合集
    training —— Applying Functional(函数式编程) Principles in C# 6 (overview)
    Mongodb 学习路线
    training_ Refactoring from Anemic Domain Model Towards a Rich One (Introducing an Anemic Domain Model)
    快速访问电脑软件的 辅助app—— PowerToys
    NoSQL
    AWS
    training —— Refactoring from Anemic Domain Model Towards a Rich One (overview)
    病毒查杀 clamav —— 资料合集 & windows上安装 & .net项目中引入
    docker for windows 收费
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700700.html
Copyright © 2020-2023  润新知