Andrioid第一行代码—运用手机多媒体B0-52-16-7B-F6-B3(2005)


一、调用摄像头

调用摄像图主要通过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);
                }
        }
    }



总结

当遇到问题,冷静,想办法一点一点的排除障碍,到最后获取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值