经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android 调用设备已有的相机应用详情
来源:jb51  时间:2021/10/25 19:07:38  对本文有异议

如果我们只是需要让用户能够拍摄照片,则可以直接请求已有相机应用拍摄照片并将照片返回给我们

1、拍照

1.1 请求相机功能

在清单文件中添加:

  1. <manifest ... >
  2. <uses-feature android:name="android.hardware.camera"
  3. android:required="true" />
  4. ...
  5. </manifest>
  6.  

如果您的应用使用相机,但不需要相机也可以正常运作,应将 android:required 设为 false。这样,Google Play 便会允许未装有相机的设备下载您的应用。

1.2 调用相机应用拍照获得缩略图

  1. static final int REQUEST_IMAGE_CAPTURE = 1;
  2.  
  3. //调用相机应用拍照
  4. private void takePictureIntent() {
  5. Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  6. if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
  7. startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
  8. }
  9. }

1.3 调用相机应用拍照获得完整图片

  1. //调用相机应用拍照获得完整图片
  2. private void takePictureGetFile() {
  3. Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  4. if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
  5. File photoFile = null;
  6. try {
  7. photoFile = createImageFile();
  8. } catch (IOException ex) {
  9. ex.printStackTrace();
  10. }
  11. if (photoFile != null) {
  12. Uri photoURI = FileProvider.getUriForFile(this,
  13. this.getPackageName()+".fileprovider",
  14. photoFile);
  15. takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
  16. startActivityForResult(takePictureIntent, REQ_2);
  17. }
  18. }
  19. }
  20.  

1.4 相机应用返回缩略图,完整图片

Android 相机应用会对返回 Intent(作为 extra 中的小型 Bitmap 传递给 onActivityResult(),使用键 "data")中的照片进行编码。

下面的代码会检索此图片,并将其显示在一个 ImageView 中

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. //获得缩略图
  5. if (requestCode == REQ_1 && resultCode == RESULT_OK) {
  6. Bundle extras = data.getExtras();
  7. Bitmap imageBitmap = (Bitmap) extras.get("data");
  8. ivThumbnail.setImageBitmap(imageBitmap);
  9. }
  10. //获得完整图片
  11. if (requestCode == REQ_2) {
  12. FileInputStream fis = null;
  13. try {
  14. fis = new FileInputStream(currentPhotoPath);
  15. Bitmap bitmap = BitmapFactory.decodeStream(fis);
  16. ivComplete.setImageBitmap(bitmap);
  17. } catch (FileNotFoundException e) {
  18. e.printStackTrace();
  19. } finally {
  20. try {
  21. fis.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25.  
  26. }
  27. }
  28. //观看视频
  29. if (requestCode == REQ_3 && resultCode == RESULT_OK) {
  30. Uri videoUri = data.getData();
  31. vvVideo.setMediaController(new MediaController(this));
  32. vvVideo.setVideoURI(videoUri);
  33. vvVideo.start();
  34. }
  35. }

2、保存文件的配置

拥有写入权限即暗示可以读取,所以只需要请求写入权限

  1. <manifest ...>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. ...
  4. </manifest>
  5.  
  6.  

注意:

getUriForFile(Context, String, File),会返回 content:// URI。对于以 Android 7.0(API 级别 24)及更高版本为目标平台的最新应用,跨越软件包边界传递 file:// URI 会导致出现 FileUriExposedException。因此,一种更通用的方法来使用 FileProvider 存储图片。

在清单文件中添加提供器:

  1. <application>
  2. ...
  3. <provider
  4. android:name="androidx.core.content.FileProvider"
  5. android:authorities="${applicationId}.fileprovider"
  6. android:exported="false"
  7. android:grantUriPermissions="true">
  8. <meta-data
  9. android:name="android.support.FILE_PROVIDER_PATHS"
  10. android:resource="@xml/file_paths" />
  11. </provider>
  12. ...
  13. </application>
  14.  
  15.  

确保授权字符串与 getUriForFile(Context, String, File) 的第二个参数匹配。 新建文件res/xml/file_paths.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  3. <external-files-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
  4. </paths>
  5.  
  6.  

路径组件对应于 getExternalFilesDir() 返回的路径(在调用 Environment.DIRECTORY_PICTURES 时)。请务必将 com.example.package.name 替换为应用的实际软件包名称。

3、录制视频

3.1 调用相机应用录制视频

  1. //调用相机应用录制视频
  2. private void takeVideo() {
  3. Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
  4. if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {//如果是null,应用会崩溃
  5. File videoFile = null;
  6. try {
  7. videoFile = createVideoFile();
  8. } catch (IOException ex) {
  9. ex.printStackTrace();
  10. }
  11. if (videoFile != null) {
  12. Uri videoURI = FileProvider.getUriForFile(this,
  13. this.getPackageName()+".fileprovider",
  14. videoFile);
  15. takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoURI);
  16. startActivityForResult(takeVideoIntent, REQ_3);
  17. }
  18. }
  19. }
  20.  

3.2 相机应用返回视频

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. //观看视频
  5. if (requestCode == REQ_3 && resultCode == RESULT_OK) {
  6. Uri videoUri = data.getData();
  7. vvVideo.setMediaController(new MediaController(this));
  8. vvVideo.setVideoURI(videoUri);
  9. vvVideo.start();
  10. }
  11. }

到此这篇关于Android 调用设备已有的相机应用详情的文章就介绍到这了,更多相关Android 调用设备已有的相机应用内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号