[Android多媒体一]调用系统相机拍照并存储到指定位置,适配安卓 7.0

Android拍照的方式:调用系统相机、自定义 Camera 相机、相册、拍照 阅读详情

项目里想添加几个小功能,拍照、录像、录音。都是调用系统的多媒体,拍摄、录制完毕也不能不管,应该将他们都存储到手机上,方便日后查看、使用。但是开发过程并不是一蹴而就,也是查阅了很多资料,向大佬请教了很多,才成功实现了功能,并且由于是Android 7.0的系统,相比以前的版本对文件的管理更加复杂。下面直接进入正题。

一、准备

创建项目后,还需要做什么准备?不是一顿敲就完事了吗?为了适配7.0的系统,确实需要准备一下:

创建项目,MultiMediaTest,包名com.my.example.multimediatest,其它默认,打开主配置文件,在Application标签下,修改并加入以下代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.example.multimediatest">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

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

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

需要读写权限,另外的就是这段代码:


适配7.0的关键,这还不够,因为指定了的资源文件还没有创建,直接对着provider_paths按Alt+Enter,在res下创建资源文件,对创建好的文件作以下修改:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--"."表示所有路径-->
    <external-path name="external_files" path="."/>
</paths>

Ok,准备完成。

二、开始编写

首先理清一下思路:

1、启动系统相机并保存文件涉及到读写权限,Android 6.0以上的系统都需要动态申请。启动相机前,检查权限,没有则申请,有则继续,拒绝权限则程序不能执行。

2、将文件存储到指定位置,需要在SD根目录下创建文件夹,把图片统一存进去。

3、因为我们不能在系统相机使用中的时候去读写文件,所以需要相机在拍摄后,返回一个结果,然后根据拍摄结果去执行读写操作。

4、即使存储了图片,系统图片库也是不会及时更新,所以还需要通知系统更新图库,让我们拍摄的照片及时的显示出来。

理清思路后开始写代码:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拍照并保存"/>

</RelativeLayout> 

MainActivity代码:

package com.my.example.multimediatest;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {



    private static final String TAG = "MainActivity";

    private String mImagePath;                   //用于存储最终目录,即根目录 / 要操作(存储文件)的文件夹

    public static final String SD_APP_DIR_NAME = "TestDir"; //存储程序在外部SD卡上的根目录的名字
    public static final String PHOTO_DIR_NAME = "photo";    //存储照片在根目录下的文件夹名字
    public static final String VOICE_DIR_NAME = "voice";    //存储音频在根目录下的文件夹名字
    public static final String VIDEO_DIR_NAME = "video";    //存储视频在根目录下的文件夹名字

    public static final int PHOTO_RESULT_CODE = 100;        //标志符,图片的结果码,判断是哪一个Intent
    public static final int VOICE_RESULT_CODE = 101;        //标志符,音频的结果码,判断是哪一个Intent
    public static final int VIDEO_RESULT_CODE = 102;        //标志符,视频的结果码,判断是哪一个Intent

    private Uri mImageUri;                                  //指定的uri

    private String mImageName;                              //保存的图片的名字

    private File mImageFile;                                //图片文件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG, "开始...");

        // android 7.0系统解决拍照的问题
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        builder.detectFileUriExposure();

        //按钮的点击事件
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //检查是否获得写入权限,未获得则向用户请求
                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    //未获得,向用户请求
                    Log.d(TAG, "无读写权限,开始请求权限。");
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]
                            {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 200);
                } else {
                    Log.d(TAG, "有读写权限,准备启动相机。");
                    //启动照相机
                    startCamera();
                }
            }
        });
    }

    /**
     * 返回用户是否允许权限的结果,并处理
     */
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResult) {
        if (requestCode == 200) {
            //用户允许权限
            if (grantResult[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d(TAG, "用户已允许权限,准备启动相机。");
                //启动照相机
                startCamera();
            } else {  //用户拒绝
                Log.d(TAG, "用户已拒绝权限,程序终止。");
                Toast.makeText(this, "程序需要写入权限才能运行", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 启动相机,创建文件,并要求返回uri
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void startCamera() {
        Intent intent = new Intent();
        //指定动作,启动相机
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        Log.d(TAG, "指定启动相机动作,完成。");
        //创建文件
        createImageFile();
        Log.d(TAG, "创建图片文件结束。");
        //添加权限
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Log.d(TAG, "添加权限。");
        //获取uri
        mImageUri = FileProvider.getUriForFile(this, "com.my.example.multimediatest.provider", mImageFile);
        Log.d(TAG, "根据图片文件路径获取uri。");
        //将uri加入到额外数据
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
        Log.d(TAG, "将uri加入启动相机的额外数据。");
        Log.d(TAG, "启动相机...");
        //启动相机并要求返回结果
        startActivityForResult(intent, PHOTO_RESULT_CODE);
        Log.d(TAG, "拍摄中...");
    }

    /**
     * 创建图片文件
     */
    private void createImageFile(){
        Log.d(TAG, "开始创建图片文件...");
        //设置图片文件名(含后缀),以当前时间的毫秒值为名称
        mImageName = Calendar.getInstance().getTimeInMillis() + ".jpg";
        Log.d(TAG, "设置图片文件的名称为:"+mImageName);
        //创建图片文件
        mImageFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
                + "/" + SD_APP_DIR_NAME + "/" + PHOTO_DIR_NAME + "/", mImageName);
        //将图片的绝对路径设置给mImagePath,后面会用到
        mImagePath = mImageFile.getAbsolutePath();
        //按设置好的目录层级创建
        mImageFile.getParentFile().mkdirs();
        Log.d(TAG, "按设置的目录层级创建图片文件,路径:"+mImagePath);
        //不加这句会报Read-only警告。且无法写入SD
        mImageFile.setWritable(true);
        Log.d(TAG, "将图片文件设置可写。");
    }

    /**
     * 处理返回结果。
     * 1、图片
     * 2、音频
     * 3、视频
     *
     * @param requestCode 请求码
     * @param resultCode  结果码 成功 -1 失败 0
     * @param data        返回的数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        Log.d(TAG, "拍摄结束。");
        if (resultCode == Activity.RESULT_OK) {
            Log.d(TAG, "返回成功。");
            Log.d(TAG, "请求码:" + requestCode + "  结果码:" + resultCode + "  data:" + data);
            switch (requestCode) {
                case PHOTO_RESULT_CODE: {
                    Bitmap bitmap = null;
                    try {
                        //根据uri设置bitmap
                        bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageUri);
                        Log.d(TAG, "根据uri设置bitmap。");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //将图片保存到SD的指定位置
                    savePhotoToSD(bitmap);
                    //更新系统图库
                    updateSystemGallery();
                    Log.d(TAG, "结束。");
                    break;
                }
                case VOICE_RESULT_CODE: {
//                    saveVoiceToSD();
                    break;
                }
                case VIDEO_RESULT_CODE: {
//                    saveVideoTOSD();
                    break;
                }
            }
        }
    }

    /**
     * 保存照片到SD卡的指定位置
     */
    private void savePhotoToSD(Bitmap bitmap) {
        Log.d(TAG, "将图片保存到指定位置。");
        //创建输出流缓冲区
        BufferedOutputStream os = null;
        try {
            //设置输出流
            os = new BufferedOutputStream(new FileOutputStream(mImageFile));
            Log.d(TAG, "设置输出流。");
            //压缩图片,100表示不压缩
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
            Log.d(TAG, "保存照片完成。");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    //不管是否出现异常,都要关闭流
                    os.flush();
                    os.close();
                    Log.d(TAG, "刷新、关闭流");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 更新系统图库
     */
    private void updateSystemGallery() {
        //把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(this.getContentResolver(),
                    mImageFile.getAbsolutePath(), mImageName, null);
            Log.d(TAG, "将图片文件插入系统图库。");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
        this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + mImagePath)));
        Log.d(TAG, "通知系统图库更新。");
    }

    /**
     * 保存音频到SD卡的指定位置
     */
    private void saveVoiceToSD() {

    }

    /**
     * 保存视频到SD卡的指定位置
     */
    private void saveVideoTOSD() {

    }

}

按照思路,很容易理解上面的代码:程序启动,点击拍照并保存按钮,开始检查权限,获得权限后,使用隐式启动的方式启动相机,在启动相机前,就把图片文件创建好,并获取到该图片的uri,方便返回结果时的处理,拍照完成时,根据是否拍照成功进行处理,若成功,则将uri转为bitmap,用于存储。存储完毕再通知系统图库更新。

三、运行结果

1、先看log打印


完整的执行流程。

2、查看刚刚拍摄的图片在手机中的位置


3、查看系统图库是否加入了刚刚拍摄的照片


4、点进去查看图片


完美!~图片质量还是不错的。

四、注意事项

需要注意的问题有四点:

1、MainActivity的onCreate中,为适配7.0的系统还需要写一下三行代码:


不然会报错。

2、provider的路径,一定要使用项目最开始的包名,如果包名修改过,会直接中断程序,因为它找不到provider,开始在这个位置弄了很久,仔细看log提示才恍然大悟,包名不对。


3、以上代码为了适配7.0的系统,我也只有一个7.0系统的测试真机,可能在4.几的机器上报错,这时候只要针对获取uri的代码,加上版本判断就好了。

4、拍照并存储只是一个方面,还有一个重要的点是怎么去图库读取拍摄的图片,由于拍摄的图片质量很高,直接读取并设置到ImageView上是行不通的,极有可能OOM,所以读取图片时需要对图片进行压缩、旋转等操作,才能保证读取成功并显示正确。

5、补充:上面的代码中,没有申请照相机权限,开始测试的时候同意了,代码中忘记加了,使用的时候还需要检查相机权限,不然会崩溃。代码中要进行检查,主配置文件也要添加权限。

    <!-- 读写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 录音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 相机权限 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <!-- 录制视频权限 -->
    <uses-permission android:name="android.permission.RECORD_VIDEO"/>
直接都加上了,后续的多媒体都要用到。



原创文章,转载请注明出处:https://blog.youkuaiyun.com/Lone1yCode/article/details/79833842


【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库02 每个分支下又细分了四个关键方向,并按照“研究对象/焦点、基本问题、核心理论/概念、研究方法、应用/目标、前沿/发展”的框架进行阐述,严格遵循了六级编码体系。在最终整合时,应建立唯一的学科分类编码表(例如,用两位数字或“ART”、“MED”、“ECO”等字母前缀),并确保所有下级编码(尺度、层次、类别、子类、具体项)的逻辑一致性。此回答中的编码为示例,实际系统需据此调整。控制过程(前馈、同期、反馈)、全面质量管理(TQM)、平衡计分卡(BSC)定量(调查、实验)、定性(访谈、民族志)、混合方法、大数据。 阅读详情

相关推荐

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

安卓调用系统相机拍照并保存在手机中,适配7.0以上版本

引言: 调用系统相机拍照是安卓中比较常见,也比较简单的功能。那么拍照后得到的照片,我们有两种处理:第一种,我们只把它们显示出来(不保存在文件中,但是这种只能显示缩略图)。第二种,我们将照片写入到文件中,即保存起来,那么就可以重复使用。对于写入到文件这种操作,7.0以上版本需要特殊照顾,以避免出现FileUriExposedException异常。 第一种(获取缩略图): 首先,启动系统相机: In...

tran_sient的博客 2129

稳压电源的隐形战场:动态特性如何影响你的嵌入式系统稳定性

本文深入探讨了稳压电源动态特性对嵌入式系统稳定性的关键影响,分析了HT7533和AMS1117等稳压芯片在输入阶跃响应和负载瞬态响应方面的性能差异。通过实测案例展示了不同场景下的动态特性表现,并提供了针对工业控制、IoT设备和射频系统的选型指南与优化策略,帮助工程师解决电源相关的隐蔽故障。

weixin_29204205的博客 609

调用系统相机拍照--是配到android-7.0

一:获取缩放图直接调用相机拍照,无需人和权限,但是缺点是只能获取到缩放图(不清晰的哦,一般不采用这种) /** * 缩放图 */ mThumbnail.setOnClickListener(new View.OnClickListener() { @Override public void

tongzhengtong的博客 9641

OPCUA二(通过OPCUA服务器访问CPU)

摘要:本文介绍了使用UaExpert软件连接西门子PLC的OPC UA配置方法,包括IP地址设置(默认端口4840)、安全认证和证书信任流程。详细说明了数据访问操作,如变量拖拽监控和属性解读(NodeId、Value、状态码等)。特别强调连接仿真Advance7时需先启动实例。最后预告下章将讲解通过KerServer访问CPU。文章涵盖配置步骤、常见问题处理及实用技巧,适合工业自动化开发者参考。

欢迎来到RaymondLeigh的知识共享基地 1336

滑模控制理论(SMC)概述

滑模控制理论(SMC)概述一、背景二、数学理论三、高维拓展四、分析 一、背景 滑模控制理论(Sliding Mode Control, SMC)是一种建立在现代控制理论基础上的控制理论,主要数学核心为李雅普诺夫函数。 滑模控制的核心思想是建立一个滑模面,将被控系统拉取到滑模面上来,使系统沿着滑模面运动。滑模控制的一个优势是无视外部扰动和不确定参数,采用一种比较“暴力”的方式达到控制的目的。 其思想和反步法有些类似,但数学实现起来更加方便而不抽象。相比反步法,滑模控制没有复杂的数学计算,也不会出现“微分爆炸”

高能阿博特的博客 6万+

android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...

这里主要是基于Android7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径。首先需要在AndroidManifest.xml声明调用相机的权限...android:required="true"/>...接着在Activity里实现打开相机拍照privatestaticfinalintREQUEST_CAPTURE_IMAG...

weixin_29944883的博客 1477

uniapp - 详细解决 H5 网页报错 Uncaught Error: Async component timed out after ? ms.(移动端h5页面白屏或加载缓慢失败,超时报错处理)

uni-app,vue3,网页,h5,移动端,手机H5页面,浏览器,报错,uniapp报错,Asynccomponenttimedoutafter,如何解决这个问题,vue3Asynccomponenttimedoutafter,异步组件超时了怎么办,async,详细解决方案,AsyncComponents异步组件,导致页面打不开了,白屏什么也不显示,网页载入非常慢卡顿,vue3网站报错,超时,nuxt3,详细解决方案,浏览器控制台报错,爆红并且页面卡住了,依旧报错,找不到异步组件的报错

🏆 前端领域优质创作者 3774

Android 调用系统相机拍照(适配7.0)、从图库选择图片、从数据库读取联系人信息、相册图片、扫描文件

一、调用系统相册图库(sdk23以上需要动态申请权限): 1. 调用系统相机拍照 注:android 7.0(sdk 24)之后拍照发生了改变,需用ContentValues或者FileProvider。 ①使用ContentValues       //获取版本 int currentapiVersion = Build.VERSION.SDK_INT; // 激活

zhangyiminsunshine的博客 1984

self‑improving‑agent 安装与配置指南(OpenClaw)

长期记忆错误反思用户偏好学习持续进化AI → 反思 → 学习 → 改进。

tiantiantbtb的博客 1337

模型预测控制(MPC)解析(六):有约束的MPC简介

本文为阅读笔记,仅供学习交流使用!!! 先从一个例子开始,说明当原始设计的控制信号满足操作约束时,控制系统的性能会显著恶化。并且只要稍加修改,如果在控制器的实现中加入约束,则性能恶化的程度可以降低,从而产生约束控制的思想。 在学习有约束控制之前,先看一个控制系统在控制信号饱和和不饱和的情况下运行的例子。 例:无阻尼振荡器的数学模型如下: 采样周期为Δt=0.1\Delta{t}=0.1Δt=0.1,对应的离散时间状态空间模型为: 设计目标是:设计一个预测控制系统,使得系统输出跟踪单位阶跃响应越快越好。预

行者无疆的博客 6654

安卓开发-调用相机

安卓开发-调用相机详细案例

A4545156的博客 4450

知识图谱构建中的数据清洗:AI原生应用高质量图谱的前提

数据清洗是知识图谱构建的核心前置环节,直接决定AI原生应用(如智能问答、个性化推荐、决策支持系统)的图谱质量与应用效能。本文以第一性原理为起点,系统解析数据清洗的理论框架、技术架构与工程实践,覆盖从多源异构数据的噪声检测到高质量知识三元组(实体-关系-实体)生成的全流程。通过层次化概念映射(专家→中级→入门)、数学形式化建模及工业级案例分析,揭示数据清洗在解决实体歧义、关系冲突、结构不一致等关键问题中的技术逻辑,并展望基于大模型的智能清洗范式演化。Completeness(完整性)

移动开发前沿的博客 404

[Android多媒体二]调用系统录音机录音并存储到指定位置,适配安卓 7.0

接上一篇文章,[Android多媒体一]调用系统相机拍照并存储到指定位置,适配安卓 7.0本文讲述如何调用系统录音机,完成录音后,对录音进行指定位置的保存。一、开始编写首先,还是理清一下思路,在着手编写代码。1、启动系统录音机并保存到指定位置依然设计读写权限,此时需要向用户请求权限,并根据用户操作进行相应的动作。录音使用到的权限有: &lt;!-- 读写权限 --&gt; &lt;u...

樱_花_庄 4368

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android动态图片适配,Android6.0动态权限适配

Android6.0动态权限适配Android6.0开始,权限分为普通权限和危险权限,危险权限:会授予应用访问用户的机密数据的权限。如果你的应用在其清单文件中列出了危险权限,用户批准你的应用试验这些权限。通过adb 命令F:\sodaoProject\automate>adb shellcepheus:/ $ pm list permissions -g -dDangerous Permis...

weixin_33850554的博客 269

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Flutter跨平台开发:图片视频保存到手机相册的完整解决方案

在移动应用开发中,文件系统操作和权限管理是基础且关键的技术环节。其核心原理在于应用如何安全、合规地访问和操作用户设备的存储空间,这直接关系到应用的功能实现与用户体验。随着Android引入作用域存储(Scoped Storage)和iOS强化Photos Framework,传统的直接文件读写方式已不再适用,开发者必须通过系统提供的MediaStore等API与媒体库进行交互。这一变化的技术价值在于更好地保护用户隐私、防止存储空间污染,并提升文件管理的统一性。在实际应用场景中,无论是社交应用保存图片、工具类

weixin_34274029的博客 384

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Aurora IMUI的10大核心功能详解:从消息列表到语音输入的完整指南

Aurora IMUI 是一个通用的即时通讯(IM)UI 组件库,专门为开发聊天应用而生。它不依赖特定的 IM SDK,提供了消息列表、输入视图等核心组件,支持文字、图片、语音、视频等多种消息类型,同时兼容 Android、iOS 和 React Native 三大平台,是快速搭建聊天界面的终极解决方案。 ## 🎯 1. 多平台支持的聊天UI组件 Aurora IMUI 最大的亮点就是**跨

gitblog_00740的博客 771

安卓使用FileProvider.getUriForFile出现问题解决

安卓使用FileProvider.getUriForFile出现问题解决 一、由于在安卓7.0以上要进行APP的自动升级,需用到FileProvider.getUriForFile方法共享安装包,首先要在AndroidManifest.xml文件中的<application 里面添加如下(在的上一行加):条目 . <provider android:name=“android.supp...

luo13788507590的博客 3万+

安卓调用系统相机进行拍照

安卓调用系统相机进行拍照 调用系统相机进行拍照的话,步骤比较简单,分为两步 使用隐式Intent打开相机 在onActivityResult回调中对图片进行处理 (传回来的图片分为缩略图和原图,缩略图比较小可以直接进行展示,原图比较大,需要传输到文件中显示) 拍照获取缩略图 <ImageView android:layout_width="200dp" android:layout_height="200dp" android:layout_cen

qq_47625961的博客 4119

Android 调用系统相册、系统相机拍照

Android 调用系统相册、系统相机拍照

OneGreenHand的博客 2366

Android调用系统照相机

调用系统相机和相册上传图片的流程:1.点击一个按钮触发调用操作。case R.id.photograph:    // 拍照    photograph.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            Intent ...

zhwadezh的博客 903

android camera2 拍照流程

正文camera2 API 的加入是从AndroidV5.0(21)开始的,因此我们使用Camera2应该是在Android 5.0(含5.0)之后。同时,对于Android6.0我们需要有动态权限的管理。这两点应该是使用Camera2使用前的最基本认知。Android 5.0对拍照API进行了全新的设计,新增了全新设计的Camera v2 API,这些API不仅大幅提高了Android系统拍照的功

小男孩 5203

android调用系统拍照、相册

android调用系统拍照、相册

chongchi_wxcc的博客 3186

android拍照简书,android系统拍照完整流程

1、拍照相片存储的临时文件File savePath=new File(Environment.getExternalStorageDirectory(),"/temp/temp.jpg");2、开启系统相机Intent cameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Uri imageUri = Uri.fromFile(sav...

weixin_34199121的博客 700

总结Android调用系统相机拍照遇到的坑

拍照功能在应用开发中几乎已成为标配,例如用户通过拍照上传头像。实现拍照功能的方式有两种。第一种是使用相机API(即Camera类)来自定义拍照,第二种是使用Intent调用系统相机来拍照。其中最常见的方式是直接调用系统相机拍照来获取照片。 调用系统相机获取照片的流程如下,这里省去了声明权限和动态权限申请: private String mFilePath;// 需要初始化,路径自定义 pr

ruancoder的博客 1万+

Android 相机教程,安卓应用开发调用系统相机教程

当一些应用要上传图片和视频时常常要调用常常会调用安卓系统的相机来照相和录像,也可以利用安卓系统提供的API自己实现照相和录像功能,下面是学习啦小编给大家整理的一些有关安卓应用开发调用系统相机教程,希望对大家有帮助!安卓应用开发调用系统相机教程启动系统相机:图中代码可以启动系统相机照相机,new了Intent之后,设置好Actionadd和Category后调用startActivity(inten...

weixin_42353996的博客 2156
上一篇: Android Studio 导入项目过慢的简单解决方案
下一篇: [Android] 仿IOS实现自定义Dialog,底部弹窗和中间弹窗工具
__椎名真白
博客等级 码龄11年 51粉丝 27原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值