Android 打开相机、相册获取图片文件,支持Android 9.0系统

解决Android 6.0以上的高版本跳转相机闪退问题,以及相机返回图片不显示问题。

代码复制可用,开发工具为:Android Studio


AndroidManifest.xml 中添加权限



    
    

    
        
            
                

                
            
        
        
    


跳转相册和相机

//跳转相册
    private void toPicture() {
        Intent intent = new Intent(Intent.ACTION_PICK);  //跳转到 ACTION_IMAGE_CAPTURE
        intent.setType("image/*");
        startActivityForResult(intent,100);
        L.e("跳转相册成功");
    }

    //跳转相机
    private void toCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  //跳转到 ACTION_IMAGE_CAPTURE
        //判断内存卡是否可用,可用的话就进行存储
        //putExtra:取值,Uri.fromFile:传一个拍照所得到的文件,fileImg.jpg:文件名
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"fileImg.jpg")));
        startActivityForResult(intent,101); // 101: 相机的返回码参数(随便一个值就行,只要不冲突就好)
        L.e("跳转相机成功");
    }

解决Android 6.0以上的高版本跳转相机闪退问题

在 BaseActivity 中添加以下代码

//跳转相机动态权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }

写的权限处理

private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
    public boolean verifyStoragePermissions(Activity activity) {
        // 检查是否有写权限
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 我们没有权限,所以提示用户
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, 1);
            return false;
        }else{
            return true;
        }
    }

获取相机返回的图片并显示

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        //判断返回码不等于0
        if (requestCode != RESULT_CANCELED){    //RESULT_CANCELED = 0(也可以直接写“if (requestCode != 0 )”)
            //读取返回码
            switch (requestCode){
                case 100:   //相册返回的数据(相册的返回码)
                    L.e("相册");
                    Uri uri01 = data.getData();
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri01));
                        ImageView01.setImageBitmap(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    break;
                case 101:  //相机返回的数据(相机的返回码)
                    L.e("相机");
                    try {
                        tempFile = new File(Environment.getExternalStorageDirectory(),"fileImg.jpg");  //相机取图片数据文件
                        Uri uri02 = Uri.fromFile(tempFile);   //图片文件
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri02));
                        ImageView01.setImageBitmap(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    }

详细完整代码:

【BaseActivity .java】

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        //跳转相机动态权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }
    }
}

【MainActivity .java】

package com.example.erp_lxkun_jak.testcamera;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;


public class MainActivity extends BaseActivity implements View.OnClickListener {


    private Button Button01;
    private Button Button02;
    private ImageView ImageView01;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {

        Button01 = findViewById(R.id.Button01);
        Button02 = findViewById(R.id.Button02);
        ImageView01 = findViewById(R.id.ImageView);

        Button01.setOnClickListener(this);
        Button02.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.Button01:
                toPicture();
                Toast.makeText(MainActivity.this,"Button 01",Toast.LENGTH_SHORT).show();
                break;
            case R.id.Button02:
                if(verifyStoragePermissions(MainActivity.this)){
                    toCamera();
                }else{
                    Toast.makeText(MainActivity.this,"没有权限",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    private File tempFile = null;   //新建一个 File 文件(用于相机拿数据)

    //获取 相机 或者 图库 返回的图片
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        //判断返回码不等于0
        if (requestCode != RESULT_CANCELED){    //RESULT_CANCELED = 0(也可以直接写“if (requestCode != 0 )”)
            //读取返回码
            switch (requestCode){
                case 100:   //相册返回的数据(相册的返回码)
                    L.e("相册");
                    Uri uri01 = data.getData();
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri01));
                        ImageView01.setImageBitmap(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    break;
                case 101:  //相机返回的数据(相机的返回码)
                    L.e("相机");
                    try {
                        tempFile = new File(Environment.getExternalStorageDirectory(),"fileImg.jpg");  //相机取图片数据文件
                        Uri uri02 = Uri.fromFile(tempFile);   //图片文件
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri02));
                        ImageView01.setImageBitmap(bitmap);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    }

    //跳转相册
    private void toPicture() {
        Intent intent = new Intent(Intent.ACTION_PICK);  //跳转到 ACTION_IMAGE_CAPTURE
        intent.setType("image/*");
        startActivityForResult(intent,100);
        L.e("跳转相册成功");
    }

    //跳转相机
    private void toCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  //跳转到 ACTION_IMAGE_CAPTURE
        //判断内存卡是否可用,可用的话就进行存储
        //putExtra:取值,Uri.fromFile:传一个拍照所得到的文件,fileImg.jpg:文件名
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"fileImg.jpg")));
        startActivityForResult(intent,101); // 101: 相机的返回码参数(随便一个值就行,只要不冲突就好)
        L.e("跳转相机成功");
    }


    private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
    public boolean verifyStoragePermissions(Activity activity) {
        // 检查是否有写权限
        int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 我们没有权限,所以提示用户
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, 1);
            return false;
        }else{
            return true;
        }
    }

}

【布局文件:activity_main.xml】




    

    

        

App下载: https://aifabu.com/IVrU
.
源码下载:https://download.csdn.net/download/erp_lxkun_jak/11261556
【注意:使用开发工具是 Android Studio 哦!】
.
.
感谢你的查阅,希望可以帮到你,祝你学习愉快!
.

我是和你一起学习的 易君

你可能感兴趣的:(Android)