android调用相册和摄像头_js调用手机截屏保存到相册

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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时,会让系统认为是在录音,状态栏就有红色录音提示
麦克风录音提示图:

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190521.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 试题库管理系统–数据库设计

    试题库管理系统–数据库设计一、概要设计1.1背景和意义目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量相应的不断增加。迫切需要计算机辅助教学系统来打破这种传统的教学模式,减轻教师的工作负担,提高教学质量。因此,本文研究设计了一个试题库管理系统,来解决和缓解高校课程

    2022年6月16日
    96
  • 牛逼plus的springboot+maven车牌识别开源系统

    牛逼plus的springboot+maven车牌识别开源系统

    2020年11月13日
    201
  • CRC校验算法[通俗易懂]

    CRC(CyclicRedundancyCheck):循环冗余检验。在链路层被广泛使用的检错技术。CRC原理:1、发送端1.1、在发送端先将数据分组,每组k个数据。假定要传送的数据是M。1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值

    2022年4月18日
    78
  • 学术资源不定期分享-【费曼物理学讲义英文原版】[通俗易懂]

    学术资源不定期分享-【费曼物理学讲义英文原版】[通俗易懂]相关资料简介理查德·费曼(全名理查德·菲利普斯·费曼),(1918年5月11日生于美国纽约)他是美国理论物理学家,被广泛认为是二战后他的研究领域中最杰出、最具影响力的人物之一。费曼因他在量子电动力学方面的工作而闻名:他描述了光如何与物质相互作用以及带电粒子如何相互作用。他还设计了粒子如何相互作用的图表(现在称为费曼图)和液氦超流体行为的量子力学解释(接近绝对零度时如何在没有摩擦的情况下流动)。第二次世界大战期间,费曼被聘为普林斯顿大学美国原子弹项目的一名工作人员(1941-42年),后来又在新墨西哥.

    2022年6月6日
    59
  • ubuntu环境变量配置文件_环境变量与用户变量

    ubuntu环境变量配置文件_环境变量与用户变量UbuntuLinux系统包含两类环境变量:系统环境变量和用户环境变量。系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效。文章转载自http://leonhongchina.blog.163.com/blog/static/180294117201132611320112/修改用户环境变量用户环境变量通常被存储在下面的文件中:~/.profile

    2025年11月21日
    2
  • mysql语句怎么拼接字符串_MySQL执行拼接字符串语句实例[通俗易懂]

    mysql语句怎么拼接字符串_MySQL执行拼接字符串语句实例[通俗易懂]–以下是一个MySQL执行拼接字符串语句实例:–为需要拼接的变量赋值SET@VARNAME=–以下是一个MySQL执行拼接字符串语句实例:–为需要拼接的变量赋值SET@VARNAME=’李’;–拼接字符串,其中?是执行拼接字符串语句的参数,@TestName是结果值SET@SQLStr0=CONCAT(‘SELECTTestNameINTO@TestNameFRO…

    2022年9月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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