Android 调用相机拍照并保存
不知不觉已经两年多已经没有写文章了,转眼间大学都要毕业了,也是有些唏嘘,今后会定期发表些文章,应该会以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 调用相机拍照并保存相关推荐
- android 调用相机拍照。适配到 Android 10
Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者 提 Bug 标签: android ...
- Android调用相机拍照高清原图(兼容7.0)
在安卓更新7.0的版本后,要调用相机拍照获取原图则需要先把拍摄后的内容保存到目录,然后再借助provider调出来显示,相比以前可以说十分繁琐,但为了摆脱马赛克画质的困扰,为了更好的用户体验,还是硬着 ...
- android相机拍照代码,Android 调用相机拍照,适配到Android 10
今天写的博客是关于Android调用手机相机拍照并显示图片.这是一个很常用的功能,并且这个功能在Android6.0.7.0.10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配, ...
- android调用相机拍照返回的照片大小太小,变得模糊
1.使用相机拍照默认情况下调用相机的方式: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForRe ...
- Android中拍照完就给图片加水印,Android调用相机拍照并添加水印
最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...
- Android调用相机拍照并添加水印
最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...
- android 拍照换头像,Android调用相机拍照,裁剪及更换头像功能的实现
1,点击弹出popwindow,选择相机或者相册 这个就不多说了,在OnclickListener里写弹出的窗口位置和样式. 2,选择拍照功能,调用手机相机. ``` //调用相机 Intent in ...
- Android 调用相机拍照,适配到Android 10,2021必看
//拒绝权限,弹出提示框. Toast.makeText(this,"拍照权限被拒绝",Toast.LENGTH_LONG).show(); } } } 申请权限后,就可以调起相机 ...
- android 调用系统相机拍照并返回路径,Android调用相机拍照并返回路径和…
调用系统图库: Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ...
最新文章
- 3168串口java_电子称串口读取数据(转)
- 常用的Linux命令,日常收集记录
- (转)虚函数和纯虚函数区别
- java返回特定下标元素_java基础--输出数组中指定元素的下标
- android xml怎么建立,androidXmlSerializer创建XML文件
- python 线程 的类库_python类库32[多线程同步Lock+RLock+Semaphore+Event]
- 【NER】NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略...
- iOS NSString URLencode
- 批量删除新浪微博关注
- Git恢复被删除的文件
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的求职之路!...
- 华硕主板实现Wake on lan 网络唤醒的种种细节
- 生理自我、社会自我、心理自我的提出者,是詹姆斯还是奥尔波特?|小白心理-312/347考研答疑
- 2021年美容师(初级)报名考试及美容师(初级)最新解析
- JavaScript 之 调用outlook发邮件功能mailto(附带换行问题)
- Centos 普通用户su到root用户提示错误
- 三角形的几何公式大全_椰岛数学:超全高中数学公式记忆表(文末分享PDF)
- EPICS记录参考--模拟输入记录(ai)
- 用强化学习玩《超级马里奥》
- EventTarget介绍
热门文章
- 江苏联亚国际展览中心跨境展批发产品B2B门户线上展会平台matchup expo SEO工作日志
- 男人不愿被打扰的五个时刻
- 用程序实现基本计算器功能
- open judge1.7.14
- SSIS学习(一) - SSIS入门
- Arduino自制打地鼠游戏机详细教程
- 合合信息——用智能文字识别技术赋能古彝文原籍数字化
- java多线程(8):Lamda表达式
- 用牛顿迭代法求方程2X3-4X2+3X-6=0在1.5附近的根。
- outlook附加文件超过服务器允许大小,如何在Outlook中更改或增加附件大小限制?...