一、调用摄像头
调用摄像图主要通过Intent来打开相机,并把图片保存在Uri中,然后通过回调方法拿到此图片
注:在6.0后要用到FileProvider,是一种特殊的内容提供器,提高了应用的安全性。
1.调用逻辑
二、使用步骤
1.实验截图
//第一步:创建文件用于保存图片
建一个new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
.内容提供器的注册
运行页面
运行结果
1.调用逻辑:
//getExternalCacheDir()获取SD卡应用关联目录,
//使用这个目录读写SD卡可不用动态申请权限
//第一步:创建文件用于保存图片
File file = new File(getExternalCacheDir(),"photo");
try {
if(file.exists()){
file.delete();
}
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//第二步:将文件转换成Uri对象
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ //版本大于6.0
imageUri = FileProvider.getUriForFile(MainActivity.this,
"com.example.revise_8_3.fileprovider",file);
}
else
imageUri = Uri.fromFile(file);
//第三步:启动相机
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); //指定图片的输出地址为imageUri
startActivityForResult(intent,TAKE_PHOTO);
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case TAKE_PHOTO :
if(resultCode == RESULT_OK){
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
2.读入数据
2.内容提供器的注册:
<provider
//和刚才FileProvider.getUriForFile参数中的保持一致
android:authorities="com.example.revise_8_4.fileprovider"
//name是固定的,不能改变
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
//name是固定的,不能改变
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
2.3.创建@xml/file_paths资源
右击res目录,new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
代码如下(示例):
<?xml version="1.0" encoding="utf-8"?>
<paths
xmlns:android="http://schemas.android.com/apk/res/android">
<external-path //用来指定Uri共享的
name="m_images" //可随意指定
path="/"/> //这样设置表示将整个SD卡共享
</paths>
2.4.权限配置
右击res目录,new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
代码如下(示例):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3.调用相册
3.4.调用相册也是用Intent实现,选择的照片可从回调的Intent中得到
1.打开相册逻辑
代码如下(示例):
private void openAclum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
/*
intent.setType(“image/*”);
//intent.setType(“audio/*”); //选择音频
//intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
//intent.setType(“video/;image/”);//同时选择视频和图片
*/
startActivityForResult(intent,CHOOSE_PHOTO);
}
3.5动态申请权限(要从sd卡读取照片,是危险权限)
代码如下(示例):
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
else{
openAlbum();
}
}
});
onRequestPermissionsResult()方法对申请结果进行处理
右击res目录,new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
代码如下(示例):
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0]== PackageManager.PERMISSION_GRANTED)
openAlbum();
else
Toast.makeText(MainActivity.this,"没有权限",Toast.LENGTH_SHORT).show();
break;
}
}
在AndroidManifest.xml中声明此权限 右击res目录,new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
代码如下(示例):
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
onActivityResult方法得到拿到的图片 由于对于不同类型解析方式不同,这里我直接把他们封装在一个类里 右击res目录,new->Directory,创建一个xml目录,在这个目录中新建file_paths文件
代码如下(示例):
package com.example.revise_8_4;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
import androidx.annotation.RequiresApi;
public class ImageKitKat {
private Context context;
public ImageKitKat(Context context) {
this.context = context;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public String handleImageOnKitKat(Intent data){
String imagePath = null;
Uri uri = data.getData();
if(DocumentsContract.isDocumentUri(context,uri)){
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
//如果uri的authority是media格式 再次解析id 将字符串分割取出后半部分才能得到真正的数字id
String id = docId.split(":")[1];//解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
}
else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Log.d("MainActivity.this","2");
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath = getPath(contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme())){
Log.d("MainActivity.this","3");
imagePath = getPath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
Log.d("MainActivity.this","44");
imagePath = uri.getPath();
}
return imagePath;
}
public String handleImageBeforeKitKat(Intent data){
Uri pathUri = data.getData();
String imagePath = getPath(pathUri,null);
return imagePath;
}
public String getPath(Uri externalContentUri, String selection) {
String path = null;
Cursor cursor = context.getContentResolver().query(externalContentUri,null,selection,null,null);
if(cursor!=null){
if(cursor.moveToFirst()){
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
}
cursor.close();
return path;
}
}
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case CHOOSE_PHOTO:
if(resultCode==RESULT_OK){
ImageKitKat imageKitKat = new ImageKitKat(MainActivity.this);
String path;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//handle(data);
path = imageKitKat.handleImageOnKitKat(data);
}
else
//headbefore(data);
path = imageKitKat.handleImageBeforeKitKat(data);
Bitmap bitmap = BitmapFactory.decodeFile(path);
imageView.setImageBitmap(bitmap);
}
}
}
总结
当遇到问题,冷静,想办法一点一点的排除障碍,到最后获取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。