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

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

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

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

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

(0)


相关推荐

  • Scapy的介绍(一)「建议收藏」

    Scapy的介绍(一)「建议收藏」介绍关于Scapy的Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。换句话说,Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过线路发送,捕获它们,匹配请求和回复等等。Scapy可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现。它可以取代hping…

  • strstr函数头文件_c++ strstr函数的实现[通俗易懂]

    strstr函数头文件_c++ strstr函数的实现[通俗易懂]函数说明:包含文件:string.h函数名:strstr函数原型:externchar*strstr(char*str1,char*str2);功能:从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。返回值:返回该位置的指针,如找不到,返回空指针。#include”stdafx.h”#include#in…

  • matlab求解下面的线性规划和整数规划[通俗易懂]

    matlab求解下面的线性规划和整数规划[通俗易懂]matlab求解下面的线性规划和整数规划  本篇博客主要讲了用matlab实际求解整数规划问题,目前还没有时间去自己实现整数规划算法,只能通过调用MATLAB的函数去实现。题目代码第一小题%线性规划代码%authorCanlongf=[-3,-2];A=[2,3;1,0.5];b=[14;4.5];C=[];d=[];xm=[0;0];xM=1e+10*[…

  • Android浏览器多窗口webview界面截屏心得「建议收藏」

    Android浏览器多窗口webview界面截屏心得「建议收藏」做Android浏览器多窗口的时候,需要使用到浏览器的webview快照,当前有三种方法,都尝试过,对第二种方法做了一点改进,整理说一下他们各自的优势:

  • SpringMVC工作流程 — 详解

    SpringMVC工作流程 — 详解SpringMVC一,SpringMVC简介二,SpringMVC的工作原理图执行流程三,SpringMVC核心组件前端控制器DispatcherServlet处理器映射器HandlerMapping处理器适配器HandlerAdapter处理器Handler视图解析器ViewResolver一,SpringMVC简介MVC:是一种架构模式,将业务逻辑和页面展示分离,使程序分层、分工合作,既相互独立,又协同合作。MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种

  • Python 源码混淆与加密

    Python 源码混淆与加密Python是一种解释型语言,没有编译过程,发布程序的同时就相当于公开了源码,这也是其作为开源语言的一个特性。但在某些场景下,我们的源码是不想被别人看到的,例如开发商业软件、编写0day漏洞POC/EXP、免杀shellcode等。多人学习python,不知道从何学起。很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。很多已经做案例的人,却不知道如何去学习更加高深的知识。那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代

发表回复

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

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