解决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】

<?xml version="1.0" encoding="utf-8"?>                

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

我是和你一起学习的 易君

更多相关文章

  1. 解决 android 在sd卡新建文件后需要重启才能找到
  2. Android遍历文件Listfile返回值为null问题解决方法适用Android8.
  3. Android上传文件至PHP服务器
  4. Android调用相机和相册详解
  5. Gradle 修改生成apk时的文件名
  6. Android 自定义相机
  7. Android 实现apk文件下载并自动安装
  8. Android客户端上传文件到服务器端
  9. Android Lib Project与Android Project中R文件的区别

随机推荐

  1. 转:Android进程生命周期
  2. 深入了解android的10个开源项目
  3. Android地震波效果SeismicWaveView
  4. 判断Android是否为模拟器
  5. android实现截图分享qq,微信
  6. Android ACTION_TIME_TICK BroadcastRece
  7. Android记事本程序源码
  8. android 模拟物理按键
  9. Android 拨打webView 里面的电话号码的方
  10. VLC for Android on Linux