android调用相册和摄像头_网页调用摄像头拍照

android调用相册和摄像头_网页调用摄像头拍照Android调用系统的拍照,打开相册功能1添加权限:uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>uses-permissionandroid:name="android.permission.CAMERA"/>2设置标志(回传码)//

大家好,又见面了,我是你们的朋友全栈君。

Android调用系统的拍照,打开相册功能


1 添加权限:


<!-- 往SDCard写入数据权限 --> 
<uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE" /> 
<!--请求访问使用照相设备-->
<uses-permission android:name="android.permission.CAMERA" />

2 设置标志(回传码)

 // 拍照回传码
public final static int CAMERA_REQUEST_CODE = 0;
  // 相册选择回传吗
    public final static int GALLERY_REQUEST_CODE = 1;

若多个地方使用了这个拍照功能 可以放在公共类中,设置为全局变量


3 在相应的java类中:

  // 拍照的照片的存储位置
    private String mTempPhotoPath;
    // 照片所在的Uri地址
    private Uri imageUri;

4 点击拍照事件中:
动态申请权限:

 //第二个参数是需要申请的权限
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {   //权限还没有授予,需要在这里写申请权限的代码
                    // 第二个参数是一个字符串数组,里面是你需要申请的权限 可以设置申请多个权限
                    // 最后一个参数是标志你这次申请的权限,该常量在onRequestPermissionsResult中使用到
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            GlobalVariable.CAMERA_REQUEST_CODE);

                }else { //权限已经被授予,在这里直接写要执行的相应方法即可
                    takePhoto();
                }

5 拍照实现方法

private void takePhoto(){
        // 跳转到系统的拍照界面
        Intent intentToTakePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 指定照片存储位置为sd卡本目录下
        // 这里设置为固定名字 这样就只会只有一张temp图 如果要所有中间图片都保存可以通过时间或者加其他东西设置图片的名称
        // File.separator为系统自带的分隔符 是一个固定的常量
        mTempPhotoPath = Environment.getExternalStorageDirectory() + File.separator + "photo.jpeg";
        // 获取图片所在位置的Uri路径 *****这里为什么这么做参考问题2***** 
                /*imageUri = Uri.fromFile(new File(mTempPhotoPath));*/
        imageUri = FileProvider.getUriForFile(MainActivity.this,
                MainActivity.this.getApplicationContext().getPackageName() +".my.provider",
                new File(mTempPhotoPath));
        //下面这句指定调用相机拍照后的照片存储的路径
        intentToTakePhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intentToTakePhoto, GlobalVariable.CAMERA_REQUEST_CODE);
    }

6 打开本地相册事件中:
动态获取权限:

 if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {   //权限还没有授予,需要在这里写申请权限的代码
                    // 第二个参数是一个字符串数组,里面是你需要申请的权限 可以设置申请多个权限
                    // 最后一个参数是标志你这次申请的权限,该常量在onRequestPermissionsResult中使用到
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            GlobalVariable.CAMERA_REQUEST_CODE);

                }else { //权限已经被授予,在这里直接写要执行的相应方法即可
                    choosePhoto();
                }

7 打开相册方法实现

private void choosePhoto(){
        Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);
        // 如果限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" 所有类型则写 "image/*"
        intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/jpeg");
        startActivityForResult(intentToPickPic, GlobalVariable.GALLERY_REQUEST_CODE);
    }

8 界面回调方法 用于将得到的照片处理

//当拍摄照片完成时会回调到onActivityResult 在这里处理照片的裁剪
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        fragment4ImageView0 = findViewById(R.id.fragment4ImageView0);
        if (resultCode == MainActivity.RESULT_OK) {
            switch (requestCode) {
                case GlobalVariable.CAMERA_REQUEST_CODE: {
                    // 获得图片
                    try {
                         //该uri就是照片文件夹对应的uri
                        Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        // 给相应的ImageView设置图片 未裁剪
                        fragment4ImageView0.setImageBitmap(bit);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                }
                case GlobalVariable.GALLERY_REQUEST_CODE: {
                    // 获取图片
                    try {
                         //该uri是上一个Activity返回的
                        imageUri = data.getData();
                        if(imageUri!=null) {
                            Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                            Log.i("bit", String.valueOf(bit));
                            fragment4ImageView0.setImageBitmap(bit);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

这里直接将得到的照片放在ImageView上 要裁剪,参考:
http://blog.csdn.net/weixin_37577039/article/details/79186862


9 权限申请回调方法

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {

        if (requestCode == GlobalVariable.CAMERA_REQUEST_CODE)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                takePhoto();
            } else
            {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
        }

        if (requestCode == GlobalVariable.GALLERY_REQUEST_CODE)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                choosePhoto();
            } else
            {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

问题一:
Attempt to invoke virtual method ‘void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)’ on a null object reference

Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
fragment4ImageView0.setImageBitmap(bit);

解决:
先检查右边,是否为空的
还是不行 检查左边 是否有findViewById

如果是在onActivityResult中设置的setImage 即使在onCreate中findView 了也是不行的 要在onActivityResult中findView


问题2:
拍照 Android N 版本遇到的问题:
android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri()
解决:
用 FileProvider去打开目录
1 创建一个类 继承FileProvider

public class GenericFileProvider extends FileProvider { 
   
}

2 Manifest.xml的application中:
添加:

<provider  android:name=".Utils.GenericFileProvider" android:authorities="${applicationId}.my.provider" android:exported="false" android:grantUriPermissions="true">
            <meta-data  android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
        </provider>

3 res/xml目录下 若没有 xml目录则创建

创建 provider_paths.xml文件

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

4 使用:

/*imageUri = Uri.fromFile(new File(mTempPhotoPath));*/
替换成:
imageUri = FileProvider.getUriForFile(MainActivity.this,
                        MainActivity.this.getApplicationContext().getPackageName() +".my.provider",
                        new File(mTempPhotoPath));

静默升降摄像头问题 若使用了下面的代码 则可能会导致手机升降摄像头 这样会让用户觉得你私自调用了摄像头 泄漏了他的隐私 要注意~

1.摄像头调用:用户没有拍照操作,但app调用到Camera1.open()时,会静默升降摄像头;
2.麦克风调用:用户没有录音操作,但app在后台调用AudioRecord时,会让系统认为是在录音,状态栏就有红色录音提示
麦克风录音提示图:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125285.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • HTTP.sys漏洞验证及防护[通俗易懂]

    HTTP.sys漏洞验证及防护[通俗易懂] 使用发包工具构造http请求包检测以fiddler工具为例,构造如下图的请求包:1GEThttp://192.168.174.145/HTTP/1.12Host:192.168.174.1453Range:bytes=0-184467440737095516154Connection:keep-alive5Cache-Control:max-age=06A…

  • OV7725鹰眼摄像头

    OV7725鹰眼摄像头OV7725鹰眼摄像头如何使用?目前的ov7725鹰眼摄像头,基本上用的都是山外的库,所以今天我们主要根据山外的库,基于k60芯片,给大家具体的讲解。1.摄像头初始化首先是摄像头的第一步就是初始化,这个我们直接去调用就行!camera_init(imgbuff);当然小伙伴在这里需要记住,需要配置中断优先级!对于我们使用摄像头的车而言,一般优先级最高的就是摄像头,所以小伙伴要记着给它分配优先级!我这里是分了五个优先级!大家也可以根据自己的需求,进行自主分配。NVIC_SetPriorit

  • Cookie–记住上一次访问时间案例(Java)

    Cookie–记住上一次访问时间案例(Java)Cookie–记住上一次访问时间案例(Java)博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!需求访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串分析可以采用Cookie来完成在服务器中的Servlet判断是否有一个名为lastTime的cookie有:不是第一次访问响应数据:欢迎回来,您上次访问时间为:2020年

  • dialog使用案例,包含增加按钮关闭弹窗

    dialog使用案例,包含增加按钮关闭弹窗

  • kettle教程[通俗易懂]

    kettle教程[通俗易懂]kettle/spoon教程donwloadwebkettle7.0downloadurlreference

  • oracle创建sequence语法_oracle sequence使用

    oracle创建sequence语法_oracle sequence使用先假设有这么一个表:createtableS_Depart(DepartIdINTnotnull,DepartNameNVARCHAR2(40)notnull,DepartOrderINTdefault0,constraintPK_S_DEPARTprimarykey(DepartId));

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号