拍照 相册选择 预览

拍照 相册选择 预览

xml界面
在这里插入图片描述
项目
在这里插入图片描述
代码部分

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final int GET_CAMERA = 1;
    private static final int PICK_PHOTO = 2;
    private static final int requestCode = 3;

    private Button pz_btn, xz_btn;
    private ImageView yl_img;

    private Uri img_uri;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化组件
        init();

    }

    //实例化组件
    private void init() {

        pz_btn = findViewById(R.id.pz_btn);
        pz_btn.setOnClickListener(this);

        xz_btn = findViewById(R.id.xz_btn);
        xz_btn.setOnClickListener(this);

    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {

            //摄像头拍照
            case R.id.pz_btn:
                File pz_photo_img = new File(getExternalCacheDir(), "pz_photo_img.jpg");
                //判断,如果有照片,则删除
                if (pz_photo_img.exists()) {
                    pz_photo_img.delete();
                } else
                    //如果系统版本大于7.0,则直接将照片的地址赋值给  img_uri  后续操作使用。
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        //
                        // com.example.camera.FileProvider 和 manifest.xml注册中要一样,千万不能写错。唯一性如果有其他一样的地址会报错。
                        img_uri = FileProvider.getUriForFile(MainActivity.this, "com.example.camera.FileProvider", pz_photo_img);
                    } else {
                        img_uri = Uri.fromFile(pz_photo_img);
                    }
                //开启相机拍照
                //系统注册 MediaStore.ACTION_IMAGE_CAPTURE_SECURE 。  MediaStore.ACTION_IMAGE_CAPTURE_SECURE也可以
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, img_uri);
                startActivityForResult(intent, GET_CAMERA);
                break;

            //从相册选择一张照片
            case R.id.xz_btn:

                //
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
                } else {
                    Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
                    intent1.setType("image/*");
                    startActivityForResult(intent1, PICK_PHOTO);
                }

                break;

        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {

            case GET_CAMERA:
                if (resultCode == RESULT_OK) {
                    try {
                        //实例化  image View
                        yl_img = findViewById(R.id.yl_img);
                        //预览的 imageView旋转90°,显示拍出来的照片才是正的。
                        yl_img.setRotation(90);
                        //根据照片地址获取图片
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(img_uri));
                        //把图片添加到预览的imageview中
                        yl_img.setImageBitmap(bitmap);

                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;

            case PICK_PHOTO:
                if (resultCode == RESULT_OK) {
                    //Android4.4版本以上的方法
                    if (Build.VERSION.SDK_INT >= 19) {
                        select_one(data);
                    } else {
                        //4.4版本以前的方法
                        select_two(data);
                    }
                }


        }
    }

    //4.4版本以前的方法
    private void select_two(Intent data) {

        Uri uri = data.getData();
        String img_path = getImagePath(uri, null);
        //获取图片的方向
        int dagree = access_photo_direction(img_path);
        path_display_img(img_path, dagree);

    }

    //Android4.4版本以上的方法,根据不同类型来获取 uri
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    private void select_one(Intent data) {

        String img_path = null;
        Uri img_uri = data.getData();
        // Document类型
        if (DocumentsContract.isDocumentUri(this, img_uri)) {
            String documentId = DocumentsContract.getDocumentId(img_uri);
            if ("com.android.providers.media.documents".equals(img_uri.getAuthority())) {
                String id = documentId.split(":")[1];
                //获取数字 id
                String select = MediaStore.Images.Media._ID + "=" + id;
                img_path = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, select);
            } else if ("com.android.providers.downloads.documents".equals(img_uri.getAuthority())) {
                Uri uri = ContentUris.withAppendedId(Uri.parse("content: //downloads/public_downloads"), Long.valueOf(documentId));
                img_path = getImagePath(uri, null);
            }

            // content类型
        } else if ("content".equalsIgnoreCase(img_uri.getScheme())) {
            img_path = getImagePath(img_uri, null);

            // file 类型
        } else if ("file".equalsIgnoreCase(img_uri.getScheme())) {
            img_path = img_uri.getPath();
        }
        //获取图片的方向
        int dagree = access_photo_direction(img_path);
        //根据路径获取 图片,以及图片的方向来显示图片
        path_display_img(img_path, dagree);
    }
	//获取 图片 方向
    private int access_photo_direction(String img_path) {
        int dagree = 0;
        ExifInterface exifInterface = null;
        try {
            exifInterface = new ExifInterface(img_path);
        } catch (IOException e) {
            e.printStackTrace();
            exifInterface = null;
        }
        if (exifInterface != null) {
            int ori = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
            switch (ori) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    dagree = 90;
                    break;

                case ExifInterface.ORIENTATION_ROTATE_180:
                    dagree = 180;
                    break;

                case ExifInterface.ORIENTATION_ROTATE_270:
                    dagree = 270;
                    break;

                default:
                    dagree = 0;
                    break;
            }
        }
        return dagree;
    }

	//根据路径获取 图片,以及图片的方向来显示图片
    private void path_display_img(String img_path, int dagree) {

        if (img_path != null) {

            Bitmap bitmap = BitmapFactory.decodeFile(img_path);
            //旋转图片
            if (dagree != 0) {
                Matrix matrix = new Matrix();
                matrix.postRotate(dagree);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            }
            //  将图片添加到预览 imageView 中
            yl_img = findViewById(R.id.yl_img);
            yl_img.setImageBitmap(bitmap);

        } else {
            Toast.makeText(this, "获取失败", Toast.LENGTH_SHORT).show();
        }

    }
	//获取选择的图片的路径
    private String getImagePath(Uri img_uri, String select) {
        String path = null;

        Cursor cursor = getContentResolver().query(img_uri, null, select, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }

        return path;
    }
}

权限 、注册部分

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Camera">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider
            android:authorities="com.example.camera.FileProvider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/photo_file_path"></meta-data>

        </provider>
    </application>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值