Android 调用设备已有的相机应用详情

目录
  • 1、拍照
    • 1.1 请求相机功能
    • 1.2 调用相机应用拍照获得缩略图
    • 1.3 调用相机应用拍照获得完整图片
    • 1.4 相机应用返回缩略图,完整图片
  • 2、保存文件的配置
  • 3、录制视频
    • 3.1 调用相机应用录制视频
    • 3.2 相机应用返回视频

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

1、拍照

1.1 请求相机功能

在清单文件中添加:

  <manifest ... >
        <uses-feature android:name="android.hardware.camera"
                      android:required="true" />
        ...
    </manifest>

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

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

    static final int REQUEST_IMAGE_CAPTURE = 1;

    //调用相机应用拍照
    private void takePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

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

//调用相机应用拍照获得完整图片
private void takePictureGetFile() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    this.getPackageName()+".fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQ_2);
        }
    }
}

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

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

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //获得缩略图
    if (requestCode == REQ_1 && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        ivThumbnail.setImageBitmap(imageBitmap);
    }
    //获得完整图片
    if (requestCode == REQ_2) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(currentPhotoPath);
            Bitmap bitmap = BitmapFactory.decodeStream(fis);
            ivComplete.setImageBitmap(bitmap);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    //观看视频
    if (requestCode == REQ_3 && resultCode == RESULT_OK) {
        Uri videoUri = data.getData();
        vvVideo.setMediaController(new MediaController(this));
        vvVideo.setVideoURI(videoUri);
        vvVideo.start();
    }
}

2、保存文件的配置

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

    <manifest ...>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        ...
    </manifest>

注意:

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

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

    <application>
       ...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>

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

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

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

3、录制视频

3.1 调用相机应用录制视频

//调用相机应用录制视频
private void takeVideo() {
    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {//如果是null,应用会崩溃
        File videoFile = null;
        try {
            videoFile = createVideoFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (videoFile != null) {
            Uri videoURI = FileProvider.getUriForFile(this,
                    this.getPackageName()+".fileprovider",
                    videoFile);
            takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoURI);
            startActivityForResult(takeVideoIntent, REQ_3);
        }
    }
}

3.2 相机应用返回视频

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //观看视频
    if (requestCode == REQ_3 && resultCode == RESULT_OK) {
        Uri videoUri = data.getData();
        vvVideo.setMediaController(new MediaController(this));
        vvVideo.setVideoURI(videoUri);
        vvVideo.start();
    }
 }

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

(0)

相关推荐

  • Android使用系统相机进行拍照的步骤

    前言 我们在日常的开发中有时候会遇到需要用到相机的需求,而相机也是很常用的东西,例如扫二维码啊拍照上传啊等等.这里我不讲像qq那样自定义很强的拍照功能(事实上我也不会),讲个最简单的调用系统相机拍照并储存 调用系统相机步骤 这里我通过一个简单的例子来讲这个内容. 我自己写了一个demo,布局很简单: <Button android:id="@+id/button" android:layout_width="wrap_content" android:layo

  • Android WebView支持input file启用相机/选取照片功能

    webview要调起input-file拍照或者选取文件功能,可以在webview.setWebChromeClient方法中重写指定的方法,来拦截webview的input事件,并做我们相应的操作. Android代码 webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress

  • Android自定义相机聚焦和显示框

    本文实例为大家分享了Android自定义相机聚焦和显示框的具体代码,供大家参考,具体内容如下 先看使用效果,白色圆框,放大后缩写并变淡隐藏 下面是代码 public class CameraFocusView extends AppCompatImageView { String TAG = getClass().getName(); //显示的圆宽显示的位置 public float currnetX = 40; public float currentY = 50; Paint paint;

  • Android OpenGLES如何给相机添加滤镜详解

    滤镜介绍 目前市面上的滤镜有很多,但整体归类也就几样,都是在fragment shader中进行处理.目前滤镜最常用的就是 lut滤镜以及调整RGB曲线的滤镜了.其他的类型变更大同小异. 动态滤镜的构建 为了实现动态下载的滤镜,我们接下来实现一套滤镜的json参数,主要包括滤镜类型.滤镜名称.vertex shader.fragment shader 文件.统一变量列表.与统一变量绑定的纹理图片.默认滤镜强度.是否带纹理宽高偏移量.音乐路径.音乐是否循环播放等参数. json 以及各个字段的介绍

  • Android开源库自定义相机模块

    简介 相机模块库,自定义相机,通过简单的调用即可实现拍照.图片裁剪.录像及录像抓拍功能: 实现图片压缩,减少图片体积:自定义相机可避免使用系统相机导致的照片或视频体积过大问题: 内置相机及sd卡权限获取的处理: github链接如下,帮忙star支持下~ github链接 实现功能: - 拍照 - 图片裁剪 - 录像 - 录像抓拍 在项目中导入该库 在工程的 build.gradle中加入: allprojects { repositories { ... maven { url "https:

  • Android实现小米相机底部滑动指示器

    近期工作内容需要涉及到相机开发,其中一个功能点就是实现一个相机预览页底部的滑动指示器,现在整理出来供大家讨论参考. 先上一张图看下效果: 主要实现功能有: 1.支持左右滑动,每次滑动一个tab 2.支持tab点击,直接跳到对应tab 3.选中的tab一直处于居中位置 4.支持部分UI自定义(大家可根据需要自己改动) 5.tab点击回调 6.内置Tab接口,放入的内容需要实现Tab接口 7.设置预选中tab public class CameraIndicator extends LinearLa

  • Android多种方式实现相机圆形预览的示例代码

    效果图如下: 一.为预览控件设置圆角 为控件设置ViewOutlineProvider public RoundTextureView(Context context, AttributeSet attrs) { super(context, attrs); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { Rect rect

  • Android 调用设备已有的相机应用详情

    目录 1.拍照 1.1 请求相机功能 1.2 调用相机应用拍照获得缩略图 1.3 调用相机应用拍照获得完整图片 1.4 相机应用返回缩略图,完整图片 2.保存文件的配置 3.录制视频 3.1 调用相机应用录制视频 3.2 相机应用返回视频 如果我们只是需要让用户能够拍摄照片,则可以直接请求已有相机应用拍摄照片并将照片返回给我们 1.拍照 1.1 请求相机功能 在清单文件中添加: <manifest ... > <uses-feature android:name="androi

  • android判断设备是否有相机的实例代码

    通过PackageManager可以判断android设备是否有相机 PackageManager pm = getPackageManager(); // FEATURE_CAMERA - 后置相机 // FEATURE_CAMERA_FRONT - 前置相机 if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) && !pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT

  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    Android 调用系统相机拍摄获取照片的两种方法实现实例 在我们Android开发中经常需要做这个一个功能,调用系统相机拍照,然后获取拍摄的照片.下面是我总结的两种方法获取拍摄之后的照片,一种是通过Bundle来获取压缩过的照片,一种是通过SD卡获取的原图. 下面是演示代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:

  • Android实现调用系统图库与相机设置头像并保存在本地及服务器

    废话不多说了,直接给大家贴代码了,具体代码如下所述: /** * 1.实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求 * 2.使用了picasso框架以及自定义BitmapUtils工具类 * 3.记得加上相关权限 * <uses-permission android:nam

  • Android 调用系统联系人界面(添加联系人,添加已有联系人,编辑和修改)

    一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("content://com.android.contacts"), "contacts")); addIntent.setType("vnd.android.cursor.dir/person"); addIntent.setType("vnd.androi

  • Android自定义ViewGroup实现右滑进入详情

    目录 前言 一.抖音直接右滑进入详情 二.闲鱼右滑进入详情 三.列表的右滑进入详情 后记 前言 在之前的 ViewGroup 的事件相关一文中,我们详细的讲解了一些常见的 ViewGroup 需要处理的事件与运动的方式. 我们了解了如何处理拦截事件,如何滚动,如何处理子 View 的协调运动等. 再复杂一点,我们可以组合在一起使用.例如在拦截事件之后滚动,或者在滚动到一个阈值之后拦截事件. 今天我们一起再巩固一下相关的知识点,以比较常见的一个应用场景,右滑进入详情的场景为例子. 这个例子中又分几

  • Android调用系统照相机拍照与摄像的方法

    前言 在很多场景中,都需要用到摄像头去拍摄照片或视频,在照片或视频的基础之上进行处理.但是Android系统源码是开源的,很多设备厂商均可使用,并且定制比较混乱.一般而言,在需要用到摄像头拍照或摄像的时候,均会直接调用系统现有的相机应用,去进行拍照或摄像,我们只取它拍摄的结果进行处理,这样避免了不同设备的摄像头的一些细节问题.本篇博客将介绍在Android应用中,如何调用系统现有的相机应用去拍摄照片与短片,并对其进行处理,最后均会以一个简单的Demo来演示效果. 1.系统现有相机应用的调用 对于

  • android调用C语言实现内存的读取与修改的方法示例

    写之前需要准备以下内容 android studio 已ROOT安卓设备 GG修改器 打开android studio,创建Native C++ Project activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro

  • Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解

    一.淘宝商品详情页效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="http:/

  • Android实现从本地图库/相机拍照后裁剪图片并设置头像

    玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片.上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像.为了大家需要,下面我们小编把完整的代码贴出来供大家参考. 先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.co

随机推荐