Android(5) —— 安卓机通过相机或相册获取图片 PhotoUtil.java

前言

当前,深度学习有很多框架:tensorflow、pytorch、caffe、keras等。很多场景下,需要训练好的模型在移动端运行。移动端的框架又有很多TensorFlow Lite、Core ML、NCNN、MNN等等。
其中 tensorflow 所对应的移动端移植框架 TensorFlow Lite。在自己这个系列记录使用 调用tfile进行神经网络预测的android的实现。

整个记录为:
Android(1) —— Android studio 开发环境搭建
Android(2) —— Android Studio找不到连接的手机
Android(3) —— 环境配置、手机端界面设计
Android(4) —— 图像分类的*.tfile的使用 Classify.java
Android(5) —— 安卓机通过相机或相册获取图片PhotoUtil.java
Android(6) —— 主函数的详解 MainActivity.java

1 代码讲解

1.1 代码概述

该脚定义了通过安卓机的相机或相册,来获取到具体的图片路径。是通过定义了public class PhotoUtil 来实现的。内容比较简单。
其中实现内容,一定要先了解 Cursor 的使用。

1.2 开启相机进行拍照

  • 设置图片保存路径。如果存在,删除重建;如果不存在,直接创建。获取该图像的 Uri
  • 创建 Intent,用于保存拍照图片相关的信息
  • startActivityForResult

   // start camera
   public static String start_camera(Activity activity, int requestCode) {
       Uri imageUri;
       // save image in cache path
       File outputImage = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
               + "/lite_mobile/", System.currentTimeMillis() + ".jpg");
       Log.d("outputImage", outputImage.getAbsolutePath());
       try {
           if (outputImage.exists()) {
               outputImage.delete();
           }
           File out_path = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
                   + "/lite_mobile/");
           if (!out_path.exists()) {
               out_path.mkdirs();
           }
           outputImage.createNewFile();
       } catch (IOException e) {
           e.printStackTrace();
       }

       if (Build.VERSION.SDK_INT >= 24) {
           // compatible with Android 5.0 or over
           imageUri = FileProvider.getUriForFile(activity,
                   "com.example.classificationdemo.provider", outputImage);
       } else {
           imageUri = Uri.fromFile(outputImage);
       }
       // set system camera Action
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //新建一个意图
       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
       // set save photo path
       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
       // set photo quality, min is 0, max is 1
       intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
       activity.startActivityForResult(intent, requestCode);//启动当前意图 第一个参数是Intent对象 第二个参数是请求的一个标识
       // return image absolute path
       return outputImage.getAbsolutePath();
   }
   

1.3 打开相册获取图片路径

  • intent.setType(“image/*”);    //选择图片
  • intent.setType(“audio/*”);     //选择音频
  • intent.setType(“video/*”);    //选择视频 (mp4 3gp 是android支持的视频格式)
  • intent.setType(“video/;image/”); //同时选择视频和图片

   // get picture in photo
   public static void use_photo(Activity activity, int requestCode) {
       Intent intent = new Intent(Intent.ACTION_PICK); //intent的action属性
       intent.setType("image/*");
       activity.startActivityForResult(intent, requestCode);
   }

1.4 图片的 Uri 转 Path

在该工程里,为了确保获取到路径,可以使用两种方式得到路径。(1) 通过 Uri;(2) 通过Cursor。
Android Uri 的相关介绍

   // get photo from Uri
   public static String get_path_from_URI(Context context, Uri uri) {
       String result;
       Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
       if (cursor == null) {
           result = uri.getPath();
       } else {
           cursor.moveToFirst();
           int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
           result = cursor.getString(idx);
           cursor.close();
       }
       return result;
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值