Android 打开相机、相册获取图片文件,支持Android 9.0系统
16lz
2021-01-23
解决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 哦!】
.
.
感谢你的查阅,希望可以帮到你,祝你学习愉快!
.
我是和你一起学习的 易君
更多相关文章
- 解决 android 在sd卡新建文件后需要重启才能找到
- Android遍历文件Listfile返回值为null问题解决方法适用Android8.
- Android上传文件至PHP服务器
- Android调用相机和相册详解
- Gradle 修改生成apk时的文件名
- Android 自定义相机
- Android 实现apk文件下载并自动安装
- Android客户端上传文件到服务器端
- Android Lib Project与Android Project中R文件的区别