调用摄像头拍照和选择相册

Aandroid调用摄像头拍照和从相册选择照片 像QQ,微信可以使用相机拍摄或者直接在相册中选取图片来对别人进行分享,这样的功能在每一个应用程序中都会很常见,下面我们就来学习一下关于如何调用摄像头和相册方面的知识 (这里推荐刚刚学习Android的同学来看一下郭霖大神的最新力作 Android 第一个行代码,我就是在学习这本书!) 1.首先我们来学习一下如何调用摄像头进行拍照: 首先我们需要修改activity_main.xml中的代码, 阅读详情

1.activity_main.xml 布局文件 

   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context="com.sh.cameraalbumnew.MainActivity">

    <Button
        android:id="@+id/take_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="take photo"/>

    <Button
        android:id="@+id/choose_album"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="choose from album"/>

    <ImageView
        android:id="@+id/picture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>
2.MainActivity.java 主文件
  
public class MainActivity extends AppCompatActivity {
    public static final int TAKE_PHOTO = 1;
    public static final int CHOOSE_PHOTO = 2;
    private Button mTakePhoto, mChoosePhoto;
    private ImageView picture;
    private Uri imageUri;

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

        mTakePhoto = (Button) findViewById(R.id.take_photo);
        mChoosePhoto = (Button) findViewById(R.id.choose_album);
        picture = (ImageView) findViewById(R.id.picture);

        mTakePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建file对象,用于存储拍照后的图片;
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");

                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();

                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (Build.VERSION.SDK_INT >= 24) {
                    imageUri = FileProvider.getUriForFile(MainActivity.this,
                            "com.sh.cameraalbumnew.fileprovider", outputImage);
                } else {
                    imageUri = Uri.fromFile(outputImage);
                }

                //启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });

        mChoosePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    openAlbum();
                }
            }
        });
    }

    //打开相册
    private void openAlbum() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent, CHOOSE_PHOTO);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    openAlbum();
                } else {
                    Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;

        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        picture.setImageBitmap(bm);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
                break;
            case CHOOSE_PHOTO:
                if (resultCode == RESULT_OK) {
                    if (Build.VERSION.SDK_INT >= 19) {  //4.4及以上的系统使用这个方法处理图片;
                        handleImageOnKitKat(data);
                    } else {
                        handleImageBeforeKitKat(data);  //4.4及以下的系统使用这个方法处理图片
                    }
                }
            default:
                break;
        }
    }

    private void handleImageBeforeKitKat(Intent data) {
        Uri uri = data.getData();
        String imagePath = getImagePath(uri, null);
        displayImage(imagePath);
    }


    private String getImagePath(Uri uri, String selection) {
        String path = null;
        //通过Uri和selection来获取真实的图片路径
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

    private void displayImage(String imagePath) {
        if (imagePath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
            picture.setImageBitmap(bitmap);
        } else {
            Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 4.4及以上的系统使用这个方法处理图片
     *
     * @param data
     */
    @TargetApi(19)
    private void handleImageOnKitKat(Intent data) {
        String imagePath = null;
        Uri uri = data.getData();
        if (DocumentsContract.isDocumentUri(this, uri)) {
            //如果document类型的Uri,则通过document来处理
            String docID = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docID.split(":")[1];     //解析出数字格式的id
                String selection = MediaStore.Images.Media._ID + "=" + id;

                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/piblic_downloads"), Long.valueOf(docID));

                imagePath = getImagePath(contentUri, null);

            }

        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            //如果是content类型的uri,则使用普通方式使用
            imagePath = getImagePath(uri, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            //如果是file类型的uri,直接获取路径即可
            imagePath = uri.getPath();

        }

        displayImage(imagePath);
    }
  
3. file_paths.xml 
<?xml version = "1.0" encoding = "utf-8"?>
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
    <external-path name = "my_images" path = "">

    </external-path>
</paths>
4.manifests.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.sh.cameraalbumnew"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <provider
            android:authorities="com.sh.cameraalbumnew.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                       android:resource="@xml/file_paths"/>
        </provider>

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

   

   

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

相关推荐

Android——调用摄像头拍照

上传头像的简单原理

weixin_62654344的博客 1805

Android 之 使用 Camera 拍照

另外,有一点要说的就是假如carema没有释放掉的话,那么下次调用carema就会报错, 报错内容是:java.lang.RuntimeException:fail to connect to camera service 所以,需要对Carema进行release();这模糊的AV画质...毕竟是编码过后的Bitmap,对了,拍完的图片是不会保存到本地的, 我们可以自己写代码把图片保存到我们的SD卡里,然后再显示,这样的图片会清晰很多, 嗯,我们写代码来试下~//定义一个保存图片的File变量。

leyang0910的博客 1872

Android 实现拍照功能,并将图片保存到本地存储

前言: 实现拍照功能的主要步骤: 创建照相机对象 设置相机参数 对照片预览 照片拍摄 获取照相机所得到的图片数据,从而可以进行下一步的活动,例如保存到本地存储,进行数据压缩,通过可视化组件显示。 停止照相 首先是布局页面activity_camera_demo.xml,用户点击进来后,通过设置完相应的参数后,对摄像头得到照片进行预览,通过TextureView实现 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xml

路宇的博客 1万+

Android多媒体实现拍照和获取照片

以下代码是Android应用开发中用于AndroidManifest.xml文件的一部分,它声明了应用对硬件和权限的需求。

m0_74174723的博客 2835

算法面经手撕系列(2)--手撕BatchNormlization

手动实现/手撕BatchNormlization

罟霖同学的站点 865

unity C# 计算3D空间任意多边形面积,距离,角度测量工具

unity C# 计算3D空间任意多边形面积,距离,角度 using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System; /// /// 划线面积,距离,角度 /// public class UnderlinedMeasureTool : MonoBehaviour { /// /// 相机 /// public Camera _c

qq_22972867的博客 2224

Android之调用摄像头拍照和从相册中选择照片

Android之调用摄像头拍照和从相册中选择照片很多应用程序都可能会用到调用摄像头拍照的功能,比如说程序里需要上传一张图片作为用户的头像,这时就会调用手机的摄像头,下面我们可以用一个例子来学习下。 新建一个PicDemo项目,然后修改main.xml中的代码,代码如下: <RelativeLayout xmlns:android=”http://schemas.android.com/ap

MIRROR的博客 1261

基于STM32的多路火灾报警系统设计

本文设计了一款基于STM32的多路火灾报警系统,利用多个传感器组合(如烟雾传感器、温度传感器等)进行数据采集与处理,精确判断火灾情况,并及时发出报警信号,保障生命与财产安全。本系统设计了一款基于STM32的多路火灾报警系统,通过结合烟雾传感器和温度传感器,提升了火灾检测的准确性和可靠性。未来,系统可以进一步集成更多传感器,如气体传感器、湿度传感器等,进一步提升火灾报警系统的智能化水平。本系统采用STM32F103单片机作为核心处理单元,结合烟雾传感器、温度传感器和报警模块,实现多通道火灾报警功能。

stm32d1219的博客 2030

调用摄像头拍照和从相册中选择

1.  声明对象和注册权限 声明对象 private EditText bookEdit/**编辑图书信息的EditText*/; private ImageView bookImage/**显示图片的按钮*/; private Button takePhotol/**拍照按钮*/, getFromCD/**从相册获取照片按钮*/, upLoad/**上传按钮*/; public stati

qust1508060414的博客 876

NS-3 和Aqua-sim-ng 学习笔记(一)

因为要搞水下网络,OMNET++不太合适,就转Aqua-sim。这是基于NS-2上的模型,NS-2需要额外学一门tcl脚本语言。 正好查到它的一个升级版Aqua-sim-NG,在github上,https://github.com/rmartin5/aqua-sim-ng是基于NS-3的,只需要基本的C++,不用学tcl语言。美滋滋。 装好ubuntu之后,安装NS-3和Aqu...

diboshang8820的博客 2191

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5564

调用摄像头拍照和从相册中选择照片

public class MainActivity extends Activity { private static final int TAKE_PHOTO = 1; private static final int CROP_PHOTO = 2; private static final int CHOOSE_PHOTO = 3; private Button btn,btn1;

相公 659

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2012

调用摄像头和相册(调用摄像头拍照和从相册中选择图片)

public class MainActivity extends Activity { public static final int TAKE_PHOTO=1; public static final int CROP_PHOTO=0; public static final int CHOOSE_PHOTO=3; private ImageView picture; private

LCY天上殿的博客 1330

Vue3 - 详细实现移动端H5网页调用摄像头拍照功能,微信公众号网页h5页面打开本地摄像头并点击按钮照相,vue3获取摄像头画面执行拍照保存,调整摄像头前置后置抓拍图片给用户展示或保存手机上传服务器

vue3,H5网页,手机移动端,vue3摄像头拍照,前端h5调用手机摄像头,移动端网页调用摄像头,H5实现手机拍照和选择上传,调用本地摄像头实现拍照,vue3调用摄像头拍照,手机浏览器开启摄像头并进行拍照,H5移动端网页中调用手机摄像头,H5实现web调用摄像头在线照相,vue3h5调用摄像头,微信公众号网页如何调用摄像头拍照,公众号H5页面实现打开摄像头照相,怎么生成临时图片,vue3项目调用摄像头实现拍照功能,摄像头打不开没反应,浏览器不兼容怎么办,摄像头权限不弹出,只能在本地运行,拒绝权限后怎么办,

🏆 前端领域优质创作者 1万+

一文入门车载以太网:从原理到实战,看完就能上手开发

新手选型遵循“适配场景、兼顾成本、优先车规”的原则:普通场景(车载娱乐、普通诊断):100Base-T1 PHY(LAN8742)+ 非TSN交换机(SJA1105)+ STM32H743 ECU + 普通STP线缆;ADAS场景:1000Base-T1 PHY(TJA1101)+ TSN交换机(SJA1110)+ NXP S32G399 ECU + 高抗干扰STP线缆;避免过度选型:如普通娱乐场景无需选择TSN交换机、ASIL-B级芯片,否则会增加成本;

getusushu的博客 318

Android调用摄像头拍照和从相册中选择(上传、更换头像)

Android调用摄像头拍照和从相册中选择(上传、更换头像)

xiaoLP1的博客 2498

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android从相册选择图片和调用系统摄像头拍照

Android开发中很多情况下需要从图册或者相机中获取到图片, 下面就分享一个小栗子。 效果为从相册或者拍照获得的图片然后设置给界面中的ImageView。 至于对话框的弹出方式这里就不赘述了,请自行参考: Android实现QQ换头像的对话框 在最底下会给出APK和源码。 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;Linea...

朝哥的博客 1015

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

AndroidStudio学习(七):调用摄像头拍照/从相册中选择照片

教材:第一行代码(第2版) 新建项目CameraAlbumTest 调用摄像头拍照 //activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_paren

fwt1226的博客 4429

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓调用手机摄像头和相册

安卓调用手机摄像头和相册

weixin_45809829的博客 2104

Android调用摄像头和相册

Android调用摄像头是很方便的。先看一下界面 布局文件activity_main.xml源码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="

luoxn28的专栏 3175

Android开发丶从相册中选择照片,调用摄像头拍照以及录制小视频

在日常开发过程中,这三种功能是再常见不过了,网上相关的文档也一大堆,不过未免让人眼花撩乱,因此记录做下整理! (PS:目前相册选择照片和调用摄像头拍照已经实现了压缩,录制小视频暂未实现,哪位大佬有好的建议,请指教!) 实现步骤: 1.新建一个AndroidStudio项目。绘制MainActivity的xml文件,这里为了直观,我们放上几个按钮和图片就行。 main_activity....

u014078990的博客 2701

Android——获得本地相册(返回拍照照片)

这里要实现类似微信选取相册的功能,其中呢,有两个功能:1、拍照获得照片。 2、从相册中选取。这里主界面就一个ImageView,通过获得照片来显示图片。1、点击拍照后将调用本地摄像头拍照,并且将拍照结果返回。由于是模拟器,所以会出现一个动态画面进行拍照,点击保存后显示拍照结果。2、接着是获得本地相册,从中选取图片。选中后返回显示图片。提示:如果手机中模拟器中没照片可以从电脑导入,(需要重启模拟器)或

Li_peilun的博客 1996

android 摄像头 简书,Android12-调用摄像头和相册

运行结果如下:2017-04-13_16-20-51.gif第一步:搭建界面布局android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">android:id="@+id/take_photo"android:layout_width="match...

weixin_28692817的博客 1629

Android 调用摄像头与相册

Android图片是必不可少的,在一些大的应用都会有选择图片或者发送刚刚拍摄的图片的功能,现在我们就来实现一个调用摄像头和相册的功能。由于Android版本的更新,Android7.0对于调用摄像头,及相片分享有了一些新的改动了。调用摄像头拍照并显示的步骤: 创建储存的File 判断API版本分类出来 获取Uri 启动相机 展示图片 调用相册并显示的步骤: 判断有无权限没有则添加 调取相册 判断AP

FLY346422332的博客 1391

vue调用手机相机相册_详解Vue调用手机相机和相册以及上传

组件 选中{{imgList.length}}张文件,共{{bytesToSize(this.size)}}javaScript代码export default {name: "cameras-and-albums",data(){return{imgList: [],datas: new FormData(),files:0,size:0}},methods:{//...

weixin_31880681的博客 3048
上一篇: 音频播放
下一篇: WebView的用法
ESUCC
博客等级 码龄18年 4粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值