1.添加权限

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

2.界面布局

<?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"tools:context=".MainActivity"android:orientation="vertical"><ImageViewandroid:id="@+id/picture"android:layout_width="wrap_content"android:layout_height="300dp"android:layout_gravity="center"/><Spaceandroid:layout_width="match_parent"android:layout_height="30dp" /><Buttonandroid:id="@+id/take_photo"android:layout_width="192dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="打开相机" /><Spaceandroid:layout_width="match_parent"android:layout_height="10dp" /><Buttonandroid:id="@+id/choose_from_album"android:layout_width="192dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="打开相册" /></LinearLayout>

3.Java文件

package com.example.test11;import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;public class MainActivity extends AppCompatActivity {private final int TAKE_PHOTO = 1;private final int CHOOSE_PHOTO = 2;private ImageView picture;private Uri imageUri;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button takephoto = findViewById(R.id.take_photo);Button chooseFromAlbum = findViewById(R.id.choose_from_album);picture = findViewById(R.id.picture);takephoto.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//创建File对象,用于储存拍照后的图片File outputImage = new File(getExternalCacheDir(),"output_image.ipg");try {if(outputImage.exists()){outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}if(Build.VERSION.SDK_INT>=24){imageUri = FileProvider.getUriForFile(MainActivity.this,"com.example.cameraalbumtest.fileprovider",outputImage);}else{imageUri = imageUri.fromFile(outputImage);}//启动相机程序Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);startActivityForResult(intent,TAKE_PHOTO);}});chooseFromAlbum.setOnClickListener(new View.OnClickListener() {@Overridepublic 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();}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch(requestCode){case TAKE_PHOTO:if(resultCode == RESULT_OK){//将拍摄的照片显示出来try{Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));picture.setImageBitmap(bitmap);}catch (Exception e){e.printStackTrace();}}break;case CHOOSE_PHOTO:if(resultCode == RESULT_OK){//判断手机型号if (Build.VERSION.SDK_INT>=19){//4.4及以上系统使用这个方法处理图片handleImageOnKitKat(data);}else{//4.4以下系统使用这个方法处理图片handleImageBeforeKitKat(data);}}break;default:break;}}private void openAlbum(){Intent intent = new Intent("android.intent.action.GET_CONTENT");intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHOTO);}@Overridepublic 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;default:}}@TargetApi(19)private void  handleImageOnKitKat(Intent data){String imagePath = null;Uri uri = data.getData();if (DocumentsContract.isDocumentUri(this,uri)){//如果是Document类型的Uri,则通过document id处理String docId = DocumentsContract.getDocumentId(uri);if ("com.android.providers.media.documents".equals(uri.getAuthority())){String id = DocumentsContract.getDocumentId(uri);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://dowloads/public_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);//根据图片路径显示图片}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();}}
}

打开相机拍照或从相册中选择照片相关推荐

  1. AndroidStudio实现相机拍照或从相册中选取照片并显示

    AndroidStudio相机拍照或从相册中选取照片并显示 本文最大优点在于适配Android8系统,项目给的平板版本很低,系统适配折磨了我很久 找了很多方法,这个版本是最简单并且可以成功运行的 0. ...

  2. android点击选择相册,android: 从相册中选择照片

    虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...

  3. php拍照从手机相册中选择,微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例...

    本文实例讲述了微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法.分享给大家供大家参考,具体如下: 目前中js-sdk 1.0版本中,预览图片提供了2个接口,接口的定义参考官方文档 1.预览 ...

  4. Android学习-运用手机多媒体-通知使用技巧、调用摄像头拍照、从相册中选取照片、播放音频和视频文件(MediaPlayer、VideoView)

    android提供了一系列的API,使得我们可以在程序中调用很多的多媒体资源,从而编写出更加丰富多彩的应用程序. 使用通知 通知(Notification)是Android系统中比较有特色的一个功能, ...

  5. php拍照从手机相册中选择,Android获取图片:拍照和从相册中选择

    概述 在Android开发中获取图片主要包括如下两种方式: 打开相机拍照 从图库中选择图片 一.打开相机拍照 打开相机拍照主要包括如下几个部分: 权限申请 打开摄像头 拍照后传回数据处理 1. 权限申 ...

  6. Android7.0以上如何获取头像(拍照或者从相册中选择)

    大概的流程 动态权限管理 创建布局文件,这里不多说了 拍照的实现 2.1创建存放图片的文件夹 2.2将文件夹路径转换为uri 2.3隐式启动相机的Activity,uri作为intent的一个参数. ...

  7. Andorid 拍照、从相册中选择图片兼容7.0uri

    其中点击事件如下:  图片: Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Med ...

  8. 调用Android系统自带相机拍照,从相册中获取图片

    一,前言: 在日常的手机应用开发过程中,经常会遇到上传图片的需求,像上传头像之类的,这就需要调用系统的相机,相册获取照片.但是在Android 系统7.0之后认为这种操作是不安全的,这篇文章主要就是记 ...

  9. Android拍照或从相册中取照片

    此文章只为记录本人在开发中遇到的坑以及学到的知识,里面可能还是存在问题,如果有问题希望大家能指出来,谢谢! 1.拍照 拍照需要适配7.0和7.0以下的手机,然后还需要申请相机和SD卡的读写权限.这次没 ...

最新文章

  1. 深度学习和几何(演讲提要)
  2. HashSet源码解析(最好先看HashMap的源码解析)
  3. 外贸常用术语_外贸中常用的会计术语及付款方式术语 | 会计英语
  4. 数据库访问的性能问题与瓶颈问题【z】
  5. 04737 c++ 自学考试2019版 第四章课后程序设计题1
  6. minigui大号字体的实现,即ttf库的使用【转】
  7. hive udaf_Hive UDAF 函数的编写
  8. php 如何打乱数组顺序,【PHP打乱数组顺序的方法有哪些,这样的程序你真的会写吗】- 环球网校...
  9. 三年级计算机 键盘指法 教案,人教版三年级信息技术《第一课 键盘操作再加强》教案(精品获奖)...
  10. mysql之家_MySQL
  11. win10默认壁纸_Win10瞬间审美爆炸,5分钟一键美化,不输万元Mac!
  12. 更改win11鼠标指针样式
  13. Firefox选择哪个IE TAB
  14. 【熊出没注意!】大家都是怎么治那些来家里玩的熊孩子的?
  15. js initialize
  16. squid 折叠回源解析
  17. matlab 相位解旋绕,相位解缠绕方法-南京航空航天大学学报.PDF
  18. 支持笔锋效果的手写签字控件
  19. java-集合框架库
  20. java的login_Java login登陆界面设计

热门文章

  1. 随手记-记录一些技术点
  2. VxWorks中文FAQ(转载)
  3. php 使用dataview,ECMAScript6中的二进制数据(ArrayBuffer + TypedArray + DataView)
  4. 什么是异常?如何处理异常?
  5. 四、无限法则roe-滑雪进阶入门小贴士
  6. JAVA编写学校超市选址问题_中小型超市商品管理系统设计与实现【开题报告+文献综述+毕业论文】.docx...
  7. 几种数据预处理方法汇总(标准/中心化、归一化、正则化)+Python代码
  8. arm指令集:精简指令集、复杂指令集
  9. 微信双开还是微信定时炸弹?- 关于非越狱iOS上微信分身高危插件ImgNaix的分析...
  10. 爬虫——爬取网页数据存入表格