获取缩略图

直接调取相机拍照,无需任何权限,但是只能获取到缩略图

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (takePictureIntent.resolveActivity(getPackageManager()) != null) {//判断是否有相机应用

startActivityForResult(takePictureIntent, REQ_THUMB);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (requestCode) {

case REQ_THUMB://返回结果

if (resultCode != Activity.RESULT_OK) return;

Bundle extras = data.getExtras();

Bitmap imageBitmap = (Bitmap) extras.get("data");

mImageView.setImageBitmap(imageBitmap);

break;

}

}

图片很模糊。一般不采取此种方式

保存全尺寸照片

调取相机拍照保存一个全尺寸的照片,必须提供完整的文件名,相机应用自动保存照片。此时也无需任何权限,创建一个空的临时文件用来保存图片,使用日期时间戳新照片返回一个唯一的文件名

String mCurrentPhotoPath;

private File createImageFile() throws IOException {

// Create an image file name

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date());

String imageFileName = "JPEG_" + timeStamp + "_";

//.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据

File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

//创建临时文件,文件前缀不能少于三个字符,后缀如果为空默认未".tmp"

File image = File.createTempFile(

imageFileName, /* 前缀 */

".jpg", /* 后缀 */

storageDir /* 文件夹 */

);

mCurrentPhotoPath = "file:" + image.getAbsolutePath();

return image;

}

每执行一次就会创建一个空的文件

利用上述方法创建的文件只能是自己的app访问,随着app的卸载,文件也会删除。对于Android N以下,文件直接Uri.fromFile(file)就可以直接使用,Audroid N 即编译app的版本 compileSdkVersion 24时,此时会报出FileUriExposedException异常,解释如下:

对于面向 Android N 的应用,Android 框架执行的 StrictMode,API 禁止向您的应用外公开 file://URI。

如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 FileUriExposedException异常。

若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。

进行此授权的最简单方式是使用 FileProvider类。 如需有关权限和共享文件的更多信息,

请参阅共享文件。

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// Ensure that there's a camera activity to handle the intent

if (takePictureIntent.resolveActivity(getPackageManager()) != null) {//判断是否有相机应用

// Create the File where the photo should go

File photoFile = null;

try {

photoFile = createImageFile();//创建临时图片文件

} catch (IOException ex) {

ex.printStackTrace();

}

// Continue only if the File was successfully created

if (photoFile != null) {

//FileProvider 是一个特殊的 ContentProvider 的子类,

//它使用 content:// Uri 代替了 file:/// Uri. ,更便利而且安全的为另一个app分享文件

Uri photoURI = FileProvider.getUriForFile(this,

"com.example.android.fileprovider",

photoFile);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);

}

}

现在,需要配置FileProvider。在应用程序的清单,提供者添加到您的应用程序,authorities="applicationId.fileprovider",使用时

Uri photoURI = FileProvider.getUriForFile(context,"applicationId.fileprovider", photoFile)

清单中authorities 和 参数authority保持一致。

android:name="android.support.v4.content.FileProvider"

android:authorities="com.youga.capturingphotos.fileprovider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/file_paths"/>

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (requestCode) {

case REQUEST_TAKE_PHOTO://返回结果

if (resultCode != Activity.RESULT_OK) return;

mImageView.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));

break;

}

}

关于FileProvider

FileProvider 是 ContentProvider 的一个特殊的子类,它有利于安全地分享应用相关的文件,通过对一个文件创建content:// Uri而不是file:/// Uri。

由于FileProvider的默认功能包括文件的content URI的生成,你并不需要在代码中定义一个子类。相反,你可以在你的应用中包含一个FileProvider通过在XML文件中指定它。对于指定FileProvider,添加一个元素在你应用的清单文件中。设置android:name属性为android.support.v4.content.FileProvider。根据你控制的域名设置android:authorities属性为一个URI authority(authorities可以随意填写,但是要保证使用时与authority保持一致,推荐applicationId.fileprovider,以免定义重复)。设置android:exported属性为false;FileProvider不需要公开。设置android:grantUriPermissions属性为true,为了允许你进行临时访问文件的授权。

android:name="android.support.v4.content.FileProvider"

android:authorities="com.youga.fileprovider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/file_paths"/>

一个FileProvider只能生成一个content URI 对应你事先指定目录下的文件。对于指定一个目录,使用元素的子元素,在XML中指定它的存储区域和路径。例如,下面的paths元素告诉FileProvider你打算请求你的私有文件区域的 images/ 子目录的content URIs

file-path 表示你应用内部存储区域的文件的子目录。这个子目录和getFilesDir()的返回值一样。external-path 表示你应用外部存储区域的文件的子目录。这个子目录和getExternalFilesDir()的返回值一样。cache-path 表示你应用内部存储区域的缓存子目录。这个子目录的根目录和getCacheDir()的返回值一样。(如果你修改了provider和paths中的值,需要把应用卸载重装或者开关机一下才能看到变化。)

照片添加到图库

上述保存全尺寸图片时,创建图片临时文件在目录getExternalFilesDir()中,图库无法访问到,我们可以直接创建文件在Environment.getExternalStorageDirectory()目录下;然后发送一个广播让图库更新就好了。当然也可以直接创建文件在图库目录下(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)),即DCIM。此时需要SD卡读写权限。

File path = Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_DCIM);

// Create an image file name

Log.i(TAG, "path:" + path.getAbsolutePath());

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date());

String imageFileName = "JPEG_" + timeStamp;

File image = File.createTempFile(

imageFileName, /* 前缀 */

".jpg", /* 后缀 */

path /* 文件夹 */

);

mPublicPhotoPath = image.getAbsolutePath();

同时发送广播

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

File f = new File(mPublicPhotoPath);

Uri contentUri = Uri.fromFile(f);

mediaScanIntent.setData(contentUri);

sendBroadcast(mediaScanIntent);

android调用系统相机进行拍照,android调用系统相机拍照相关推荐

  1. android 实现自动拍照,Android:调用系统相机实现拍照+裁切(兼容7.0以上系统)

    android.jpg 前言 在平时的工作中,我们会经常遇到这样的需求:比如更改用户头像,我们就需要打开相机或相册,选择照片后进行裁剪,最后上传给后台... 相信这样的功能对小伙伴们来说可能早已司空见 ...

  2. android 三星调用拍照,Android拍照与相机适配问题汇总

    问题一:onActivityResult方法中的data返回为空. 问题原因:使用Intent调用手机内相机程序时,如果我们设置了照片的存储路径时,有数据表明,93%的机型的data将会是Null,所 ...

  3. Android apps 拍立知-功能实现2(相机/选择相册及图像识别调用)

    上一篇实现了语音播放的功能,接下来就开始实现相机及图像识别功能调用. 首先,画一个大致的流程图方便理解: 以下是对相机/选择相册进行实现. (大家可以参考其它Android调用相机/选择相册的教程,不 ...

  4. Android相机资源占用,为保护用户隐私Android 11调整相机选项 APP调用相机时只可使用默认相机...

    据外媒报道目前谷歌在 Android 11 测试版里带来新的调整,此次调整是关于安卓系统对于默认相机调用选择的. 在安卓旧版本中当APP调用相机时会罗列用户已经安装的所有相机应用,这当然也包括那些自带 ...

  5. android native 相册,React Native手动实现调用原生相机相册(Android端)

    前言 最近一直在学习RN的相关开发,想做一部分调用原生的实现,来练练手,于是就有了下面这个demo,由于本人是Android开发,所以只实现了Android端的效果. Demo 主要实现 这种调用原生 ...

  6. Android多媒体实现拍照,调用相册,音频等功能

    加入消息提醒功能,每次发消息,使用通知显示人名.头像和内容 加入头像设置功能,支持拍照选取和从相册选取,裁剪 加入播放器功能,支持播放音乐和视频 首先看一下项目的总体: 项目名为Total,它是由三部 ...

  7. android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法

    一.启动android默认浏览器 这样子,android就可以调用起手机默认的浏览器访问. 二.指定相应的浏览器访问 1.指定android自带的浏览器访问 ( "com.android.b ...

  8. Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?

    目录 故事背景 二.开发步骤 Step1.添加一个专属系统级服务 2.1.1.模仿Android原生服务接口,如WifiManager,规划自己的Manager 2.1.2.为我们的Manager生成 ...

  9. android调用系统音频播放器,Android使用Service实现简单音乐播放实例

    Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了.Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行. Androi ...

  10. 在Android中调用图片、视频、音频、录音、拍照

    在Android中调用图片.视频.音频.录音.拍照 //选择图片 requestCode 返回的标识 Intent innerIntent = new Intent(Intent.ACTION_GET ...

最新文章

  1. Customer Success Case Study Library
  2. LeetCode374 猜数字大小 (二分法)
  3. mysql -u root -p 解释
  4. CCKS 2019 | 百度 CTO 王海峰详解知识图谱与语义理解
  5. php任务分配思路_PHP执行定时任务的几种方法思路
  6. 100篇原创博文有感
  7. nvidia-docker2 在 Kubernetes 上实践
  8. php搜索所有路线,php包含文件路径查找规则
  9. java object 数组_Java用Object实现数组队列的泛思与理解
  10. 学习springBoot(8)RabbitMQ
  11. HTML 5 新标签
  12. Web版本的国际通讯工具合集
  13. 国际信息研究学会专家杜彪:汉字识别是如何走上机器学习领域巅峰的?
  14. MySQL学习笔记04-DDL语句学习
  15. 5·29“爱脚日”,双驰“个性化量脚制鞋”以爱之名给你呵护
  16. 【T-SQL】T-SQL语句整理(基于SQL Server)
  17. Koa2常用的一些中间件
  18. 精美的国外扁平化网页设计作品
  19. 【ReentrantLock源码分析】1.xdb中的使用 2.获取和阻塞(阻塞前的一些死心不改)的源码
  20. SQLServe 配置管理器不见了

热门文章

  1. 基于Go Packet实现网络数据包的捕获与分析
  2. 无锁并发和无等待并发的对比分析
  3. 大话RAC介质恢复---联机日志损坏
  4. 听飞狐聊JavaScript设计模式系列12
  5. 中止执行后超过2年_10年后超过美国!汪涛:中国GDP将达到28万亿美元
  6. Python卸载报错:No Python 3.8 installation was detected
  7. 全网首发:JAVA的+=类算符,带有自动类型转换功能
  8. VS2010编译:_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
  9. 泰安本地话听不懂,为何后来能勉强听懂?
  10. 客气话要靠谱。比如公司业务一直没开展,却说学到了太多东西,那学的难道是怎样把公司搞死?