不知不觉已经两年多已经没有写文章了,转眼间大学都要毕业了,也是有些唏嘘,今后会定期发表些文章,应该会以Android为主,也会夹杂其他领域的一些文章。

话不多说,今天做了一个小demo,就是调用相机拍照,然后将照片显示并存储,来先看一下效果图。

界面有些丑,实在懒得弄了,勿怪。

既然是拍照demo,所以把很多可有可无的代码都去掉了,比如权限申请之类的,但是不影响正常运行,接下来看实现代码:

首先,我们需要在主配置文件中声明provider,与activity同级别

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="shanzang"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider>

之所以要用到provider,是因为从Android7.0开始,就不允许在 App 间,使用 file:// 的方式,传递一个 File ,否则就会抛出异常,而provider的作用恰好就是用过 content://的模式替换掉 file://,看上去只是换了个前缀,但其实是有真实路径转为了虚拟路径。

下面是provider中的一些属性:
authorities:相当与一个标识,在当前系统内必须是唯一值,一般会用包名,不过无所谓。
exported:表示该 FileProvider 是否向其他应用公开,true表示公开
granUriPermissions:是否允许授权文件的临时访问权限。这里需要,所以是 true。
meta-data,指向一个xml文件,这个xml文件的作用就是将真实的文件路径,根据设定的格式转化为虚拟路径。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="my_images"path="img"/>
</paths>

name自己取,path表示自己想要使用的文件目录,其中external-path标签相当于Environment.getExternalStorageDirectory()路径,和path属性结合起来,就是:Environment.getExternalStorageDirectory()/img,除了external-path外,还有其他的一些标签,比如:files-path、cache-path等,我就不一一介绍了,感兴趣的可以自己查一下。

布局文件:activity_file.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent" ><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击拍照"android:id="@+id/btn"></Button><ImageViewandroid:layout_width="match_parent"android:layout_height="400dp"android:id="@+id/imageView"></ImageView></LinearLayout>

FileActivity:

public class FileActivity extends AppCompatActivity {private Button cameraBtn;private ImageView imageView;private Uri ImageUri;private static String filePath;public void onCreate(Bundle saveInstanceState){super.onCreate(saveInstanceState);setContentView(R.layout.activity_file);cameraBtn = findViewById(R.id.btn);imageView = findViewById(R.id.imageView);cameraBtn.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {File outputImage = new File(getExternalFilesDir(null),"outputImage.jpg");try {//创建一个文件,等待输入流outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}//第二个参数与provider的authorities属性一致ImageUri = FileProvider.getUriForFile(FileActivity.this,"shanzang",outputImage);//直接使用隐式Intent的方式去调用相机,就不需要再去申请相机权限Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//指定拍照的输出地址,当向intent传入MEdiaStore.Exter_OUTPUT参数后,表明这是一个存储动作,相机拍摄到的图片会直接存储到相应路径,不会缓存在内存中intent.putExtra(MediaStore.EXTRA_OUTPUT,ImageUri);//第二个参数为requestCode,他的值必须大于等于0,否则就不会回调startActivityForResult(intent,1);}});}protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 1) {if (resultCode == RESULT_OK)try {//拿到相机存储在指定路径的图片,而后将其转化为bitmap格式,然后显示在界面上Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}}
}

综上

有关代码的一些解释和注意事项我都写在注释里了,应该很容易看明白,最后,再理一遍总体的逻辑:用户点击按钮之后,会通过隐式Intent的方式去调用相机,拍照之后将图片存储在指定路径,之后回调onActivityResult方法,获取到图片的输入流,将其显示在界面上。

以上就是全部内容,本人才疏学浅,若有错误,还请海涵,也欢迎指正。

Android 调用相机拍照并保存相关推荐

  1. android 调用相机拍照。适配到 Android 10

    Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者   提 Bug 标签: android ...

  2. Android调用相机拍照高清原图(兼容7.0)

    在安卓更新7.0的版本后,要调用相机拍照获取原图则需要先把拍摄后的内容保存到目录,然后再借助provider调出来显示,相比以前可以说十分繁琐,但为了摆脱马赛克画质的困扰,为了更好的用户体验,还是硬着 ...

  3. android相机拍照代码,Android 调用相机拍照,适配到Android 10

    今天写的博客是关于Android调用手机相机拍照并显示图片.这是一个很常用的功能,并且这个功能在Android6.0.7.0.10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配, ...

  4. android调用相机拍照返回的照片大小太小,变得模糊

    1.使用相机拍照默认情况下调用相机的方式: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForRe ...

  5. Android中拍照完就给图片加水印,Android调用相机拍照并添加水印

    最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...

  6. Android调用相机拍照并添加水印

    最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...

  7. android 拍照换头像,Android调用相机拍照,裁剪及更换头像功能的实现

    1,点击弹出popwindow,选择相机或者相册 这个就不多说了,在OnclickListener里写弹出的窗口位置和样式. 2,选择拍照功能,调用手机相机. ``` //调用相机 Intent in ...

  8. Android 调用相机拍照,适配到Android 10,2021必看

    //拒绝权限,弹出提示框. Toast.makeText(this,"拍照权限被拒绝",Toast.LENGTH_LONG).show(); } } } 申请权限后,就可以调起相机 ...

  9. android 调用系统相机拍照并返回路径,Android调用相机拍照并返回路径和…

    调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ...

最新文章

  1. 3168串口java_电子称串口读取数据(转)
  2. 常用的Linux命令,日常收集记录
  3. (转)虚函数和纯虚函数区别
  4. java返回特定下标元素_java基础--输出数组中指定元素的下标
  5. android xml怎么建立,androidXmlSerializer创建XML文件
  6. python 线程 的类库_python类库32[多线程同步Lock+RLock+Semaphore+Event]
  7. 【NER】NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略...
  8. iOS NSString URLencode
  9. 批量删除新浪微博关注
  10. Git恢复被删除的文件
  11. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的求职之路!...
  12. 华硕主板实现Wake on lan 网络唤醒的种种细节
  13. 生理自我、社会自我、心理自我的提出者,是詹姆斯还是奥尔波特?|小白心理-312/347考研答疑
  14. 2021年美容师(初级)报名考试及美容师(初级)最新解析
  15. JavaScript 之 调用outlook发邮件功能mailto(附带换行问题)
  16. Centos 普通用户su到root用户提示错误
  17. 三角形的几何公式大全_椰岛数学:超全高中数学公式记忆表(文末分享PDF)
  18. EPICS记录参考--模拟输入记录(ai)
  19. 用强化学习玩《超级马里奥》
  20. EventTarget介绍

热门文章

  1. 江苏联亚国际展览中心跨境展批发产品B2B门户线上展会平台matchup expo SEO工作日志
  2. 男人不愿被打扰的五个时刻
  3. 用程序实现基本计算器功能
  4. open judge1.7.14
  5. SSIS学习(一) - SSIS入门
  6. Arduino自制打地鼠游戏机详细教程
  7. 合合信息——用智能文字识别技术赋能古彝文原籍数字化
  8. java多线程(8):Lamda表达式
  9. 用牛顿迭代法求方程2X3-4X2+3X-6=0在1.5附近的根。
  10. outlook附加文件超过服务器允许大小,如何在Outlook中更改或增加附件大小限制?...