大概的流程

  1. 动态权限管理
  2. 创建布局文件,这里不多说了
  3. 拍照的实现
    2.1创建存放图片的文件夹
    2.2将文件夹路径转换为uri
    2.3隐式启动相机的Activity,uri作为intent的一个参数.
    2.4拍照结束后,执行onActivityResult(…)获得图片
  4. 相册选取图片
    3.1启动相册Activity
    3.2选择结束后,执行onActivityResult(…)获得图片

1、动态获取权限

(1)AndroidManifest.xml添加如下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<activityandroid:name=".UserBaseInfoActivity"android:windowSoftInputMode="stateHidden"><intent-filter><action android:name="androd.media.action.IMAGE_CAPTURE"/><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>

(2)通过代码动态获取权限:

//判断android版本号,弹出申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {showConfirmAppPermissions();//添加以下代码,否则Android7.0以后调用相机时会出现闪退的问题StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());}
// 7.0动态申请权限
public void showConfirmAppPermissions() {if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) !=PackageManager.PERMISSION_GRANTED) {if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {} else {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);}}
}

2、布局文件xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@color/colorLightGray"xmlns:android="http://schemas.android.com/apk/res/android"><RelativeLayoutandroid:id="@+id/UserBaseInfo_RLayoutTitle"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentTop="true"android:background="@color/colorLightBlue"><ImageViewandroid:id="@+id/UserBaseInfo_ivGoBack"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:paddingLeft="5dp"android:src="@mipmap/getbackwhite"/><TextViewandroid:id="@+id/UserBaseInfo_tvTitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="50dp"android:layout_marginRight="50dp"android:singleLine="true"android:text="基本信息"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:textColor="@color/colorWhite"android:textSize="@dimen/textTitleSize"android:focusable="true"android:focusableInTouchMode="true"/></RelativeLayout><ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:paddingLeft="10dp"android:text="用户头像"android:textSize="16dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="100dp"android:background="@color/colorWhite"android:orientation="horizontal"android:paddingLeft="10dp"><ImageViewandroid:id="@+id/UserBaseInfo_ivAvatar"android:layout_width="80dp"android:layout_height="80dp"android:layout_gravity="center_vertical"android:scaleType="fitXY"android:src="@mipmap/no_avatar" /><ImageViewandroid:id="@+id/UserBaseInfo_ivAvatarAdd"android:layout_width="80dp"android:layout_height="80dp"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"android:scaleType="fitXY"android:src="@mipmap/add_icon" /></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:paddingLeft="10dp"android:text="个人信息"android:textSize="16dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/colorWhite"android:orientation="vertical"android:paddingLeft="10dp"android:paddingRight="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="姓名"android:textSize="14dp" /><EditTextandroid:id="@+id/UserBaseInfo_etUserName"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:background="@drawable/edittext_bgwhite_noborder"android:hint="请输入您的姓名"android:textSize="14dp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/colorLightGray"></View><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="微信号"android:textSize="14dp" /><EditTextandroid:id="@+id/UserBaseInfo_etWebChatNumber"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:background="@drawable/edittext_bgwhite_noborder"android:hint="请输入您的微信号"android:textSize="14dp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/colorLightGray"></View><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="生日"android:textSize="14dp" /><TextViewandroid:id="@+id/UserBaseInfo_tvBirthday"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:hint="2018年7月15日"android:background="@drawable/edittext_bgwhite_noborder"android:textSize="14dp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/colorLightGray"></View><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="手机号"android:textSize="14dp" /><EditTextandroid:id="@+id/UserBaseInfo_etPhone"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:background="@drawable/edittext_bgwhite_noborder"android:hint="请输入您的手机号"android:textSize="14dp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/colorLightGray"></View><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="身份证号"android:textSize="14dp" /><EditTextandroid:id="@+id/UserBaseInfo_etCardNO"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:background="@drawable/edittext_bgwhite_noborder"android:hint="请输入您的身份证号"android:textSize="14dp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/colorLightGray"></View><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="15dp"android:paddingTop="15dp"><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="邮箱"android:textSize="14dp" /><EditTextandroid:id="@+id/UserBaseInfo_etEmail"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="3"android:background="@drawable/edittext_bgwhite_noborder"android:hint="请输入您的邮箱"android:textSize="14dp" /></LinearLayout></LinearLayout><Buttonandroid:id="@+id/UserBaseInfo_btnSubmit"android:layout_width="match_parent"android:layout_height="35dp"android:layout_marginBottom="20dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_marginTop="20dp"android:background="@drawable/btn_circlecorner_gradient"android:text=" 提交"android:textColor="@color/colorWhite" /></LinearLayout></ScrollView></LinearLayout>

3、UserBaseInfoActivity.java的代码如下:

package com.deepreality.membership_app;import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;import com.deepreality.membership_app.CustomView.MyAlertDialog;
import com.deepreality.membership_app.Model.DeviceBaseInfo;import java.io.File;public class UserBaseInfoActivity extends AppCompatActivity implements View.OnClickListener {private Context mContext;private ImageView ivGoBack, ivAvatar, ivAvatarAdd;private TextView tvBirthday;private static final int CROP_PHOTO = 2;private static final int REQUEST_CODE_PICK_IMAGE=3;private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE_TAKE_PHOTO = 6;private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE_CHOOSE_IMAGE = 7;private File fileImage;private Uri imageUri;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//隐藏标题栏supportRequestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_userbaseinfo);baseDataInit();bindViews();bindViewAddListener();}private void baseDataInit() {mContext = this;}private void bindViews() {ivGoBack = findViewById(R.id.UserBaseInfo_ivGoBack);ivAvatar = findViewById(R.id.UserBaseInfo_ivAvatar);ivAvatarAdd = findViewById(R.id.UserBaseInfo_ivAvatarAdd);tvBirthday = findViewById(R.id.UserBaseInfo_tvBirthday);}private void bindViewAddListener() {ivGoBack.setOnClickListener(this);ivAvatarAdd.setOnClickListener(this);tvBirthday.setOnClickListener(this);}/*** 拍照并检查权限*/public void takePhoneAndCheckPermissions(){if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA},MY_PERMISSIONS_REQUEST_CALL_PHONE_TAKE_PHOTO);}else {takePhoto();}}/*** 从相册中选择图片并检查权限*/public void choosePhoneAndCheckPermissions(){if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},MY_PERMISSIONS_REQUEST_CALL_PHONE_CHOOSE_IMAGE);}else {choosePhoto();}}/*** 拍照*/private void takePhoto(){//最后一个参数是文件夹的名称,可以随便起File file = new File(Environment.getExternalStorageDirectory(), "MemberShipAvatars");if(!file.exists()){file.mkdir();}//这里将时间作为不同照片的名称fileImage = new File(file, System.currentTimeMillis()+".jpg");//如果该文件夹已经存在,则删除它,否则创建一个try {if (fileImage.exists()) {fileImage.delete();}fileImage.createNewFile();} catch (Exception e) {e.printStackTrace();}//隐式打开拍照的Activity,并且传入CROP_PHOTO常量作为拍照结束后回调的标志imageUri = Uri.fromFile(fileImage);Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, CROP_PHOTO);}/*** 从相册选取图片*/private void choosePhoto(){Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");//相片类型startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);}/*** 权限返回的判断* @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_CALL_PHONE_TAKE_PHOTO: {takePhoto();break;}case MY_PERMISSIONS_REQUEST_CALL_PHONE_CHOOSE_IMAGE: {choosePhoto();break;}default:break;}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overrideprotected void onDestroy() {super.onDestroy();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.UserBaseInfo_ivGoBack: {finish();break;}case R.id.UserBaseInfo_tvBirthday: {final MyAlertDialog dialog = new MyAlertDialog(mContext, R.style.myDialog);final View view1 = View.inflate(mContext, R.layout.layout_datepicker, null);Button dialogConfirm = (Button) view1.findViewById(R.id.Layout_DatePicker_btnConfirm);final DatePicker datePicker = view1.findViewById(R.id.Layout_DatePicker_dPicker);dialog.setView(view1);dialog.setProperty(0, 0, 800, 600);//设置坐标和宽高dialog.setCanceledOnTouchOutside(true);dialog.show();dialogConfirm.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//doSomethingint year = datePicker.getYear();//月份获取的值会比实际月份少1int month = datePicker.getMonth() + 1;int day = datePicker.getDayOfMonth();String dateStr = year + "年" + month + "月" + day + "日";tvBirthday.setText(dateStr);dialog.dismiss();}});break;}case R.id.UserBaseInfo_ivAvatarAdd: {final MyAlertDialog dialog = new MyAlertDialog(mContext, R.style.myDialog);final View view1 = View.inflate(mContext, R.layout.layout_userbaseinfo_avatar, null);Button btnTakePhoto = (Button) view1.findViewById(R.id.Layout_UserBaseInfo_Avatar_btnTakePhoto);Button btnChooseImage = (Button) view1.findViewById(R.id.Layout_UserBaseInfo_Avatar_btnChooseImage);dialog.setView(view1);dialog.setProperty(0, 0, DeviceBaseInfo.DEVICE_WIDTH - 20, 400);//设置坐标和宽高dialog.setCanceledOnTouchOutside(true);dialog.show();btnTakePhoto.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "拍照", Toast.LENGTH_SHORT).show();takePhoneAndCheckPermissions();dialog.dismiss();}});btnChooseImage.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext, "从相册中选择", Toast.LENGTH_SHORT).show();choosePhoneAndCheckPermissions();dialog.dismiss();}});break;}default:break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case CROP_PHOTO:if (resultCode == RESULT_OK) {try {//该uri就是照片文件夹对应的uriBitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));ivAvatar.setImageBitmap(bit);} catch (Exception e) {e.printStackTrace();Log.d("tag",e.getMessage());}}break;case REQUEST_CODE_PICK_IMAGE:if (resultCode == RESULT_OK) {try {//该uri是上一个Activity返回的Uri uri = data.getData();Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));ivAvatar.setImageBitmap(bit);} catch (Exception e) {e.printStackTrace();Log.d("tag",e.getMessage());}}break;default:break;}super.onActivityResult(requestCode, resultCode, data);}
}

特别注意:个别品牌(例如,小米,小米,小米)的手机会出现拍照或者选择图片之后,头像的显示方向不对,一般是旋转了90度!!!因为他们本身在保存图片的时候,已经旋转了90度了。如果我们能拿到那个旋转值,就可以进行图片旋转来达到我们的目的了。

解决方案:

(将输入流InputStream转换为Bitmap后,那个旋转值就获取不到了)

1、先将输入流转换为byte[]数组,然后保存为File对象到本地。

2、通过文件路径来获取旋转值。

3、通过旋转值来进行图片旋转。

代码如下:

/*** 根据Uri来获取图片旋转后的Bitmap对象* @param imgUri* @return*/
private Bitmap rotaingImageViewBaseOfImageUri(Uri imgUri) {//该uri就是照片文件夹对应的uritry {byte[] bytes = PublicMethodUtil.toByteArray(getContentResolver().openInputStream(imgUri));//保存文件PublicMethodUtil.createFileWithByte(bytes);//获取旋转角度int degree = PublicMethodUtil.readPictureDegree(avatarImagePath);bitmap = PublicMethodUtil.Bytes2Bimap(bytes);bitmap = PublicMethodUtil.rotaingImageView(degree, bitmap);return bitmap;} catch (IOException e) {e.printStackTrace();}return null;
}

其中,调用的其他方法为:

/*** 读取照片旋转角度** @param path 照片路径* @return 角度*/
public static int readPictureDegree(String path) {int degree = 0;try {ExifInterface exifInterface = new ExifInterface(path);int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90:degree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:degree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:degree = 270;break;}} catch (IOException e) {e.printStackTrace();}return degree;
}/*** 旋转图片* @param angle 旋转角度* @param bitmap 被旋转的对象* @return*/
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {Bitmap returnBm = null;// 根据旋转角度,生成旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(angle);try {// 将原始图片按照旋转矩阵进行旋转,并得到新的图片returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);} catch (OutOfMemoryError e) {}if (returnBm == null) {returnBm = bitmap;}if (bitmap != returnBm) {bitmap.recycle();}return returnBm;
}/*** InputStream转换为byte[]数组* @param input* @return* @throws IOException*/
public static byte[] toByteArray(InputStream input) throws IOException {ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int n = 0;while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);}return output.toByteArray();
}/*** byte[]数组转换为Bitmap对象* @param b* @return*/
public static Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}
}/*** 根据byte数组生成文件** @param bytes*            生成文件用到的byte数组*/
public static void createFileWithByte(byte[] bytes) {// TODO Auto-generated method stub/*** 创建File对象,其中包含文件所在的目录以及文件的命名*/File file = new File(UserBaseInfo.userImageDirectory + "/" + UserBaseInfo.userAvatarImageName);// 创建FileOutputStream对象FileOutputStream outputStream = null;// 创建BufferedOutputStream对象BufferedOutputStream bufferedOutputStream = null;try {// 如果文件存在则删除if (file.exists()) {file.delete();}// 在文件系统中根据路径创建一个新的空文件file.createNewFile();// 获取FileOutputStream对象outputStream = new FileOutputStream(file);// 获取BufferedOutputStream对象bufferedOutputStream = new BufferedOutputStream(outputStream);// 往文件所在的缓冲输出流中写byte数据bufferedOutputStream.write(bytes);// 刷出缓冲输出流,该步很关键,要是不执行flush()方法,那么文件的内容是空的。bufferedOutputStream.flush();} catch (Exception e) {// 打印异常信息e.printStackTrace();} finally {// 关闭创建的流对象if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if (bufferedOutputStream != null) {try {bufferedOutputStream.close();} catch (Exception e2) {e2.printStackTrace();}}}
}

Demo地址:https://download.csdn.net/download/lpcrazyboy/11038396

问题汇总:

(1)异常信息:exposed beyond app through ClipData.Item.getUri()

首先在AndroidManifest.xml中添加provider

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

res/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>

然后修改代码

void takePhoto(String cameraPhotoPath) {File cameraPhoto = new File(cameraPhotoPath);Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Uri photoUri = FileProvider.getUriForFile(this,getPackageName() + ".provider",cameraPhoto);takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
}

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

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

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

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

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

  3. 【Flutter】Flutter 拍照示例 ( 浮动按钮及点击事件 | 底部显示按钮组件 | 手势检测器组件 | 拍照并获取当前拍摄照片 | 从相册中选择图片 )

    文章目录 一.浮动按钮及点击事件 二.底部显示按钮组件 三.手势检测器组件 四.image_picker 完整代码示例 五.相关资源 一.浮动按钮及点击事件 一般使用 Scaffold 组件作为界面的 ...

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

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

  5. 打开相机拍照或从相册中选择照片

    1.添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ...

  6. Android中拍照(相册中选择)并上传图片功能(包括动态获取权限)

    作为新手小白,为了实现这个拍照和相册选取图片并上传功能,确实花费了很多时间,因为实现不容易,所以记录下来,一和大家分享,二为之后学习做个备忘. 一.实现效果 二. 整体思路 Android手机客户端, ...

  7. (Android7.0)Android获取PID、TID、UID

    注:文章可能完全摘录,参考或完全自创,如有摘录或参考,会在文章最下面备注参考资料的地址(而不一定是原始文章的地址).如有版权问题,请及时告知. 文章目的在于整理分享本人学到的知识,可能会有错误或表达不 ...

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

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

  9. Android 拍照以及相册中选择(适配高版本)————上传多张照片之压缩处理、在线预览可伸缩放大(二)

    ______ Introduction ______ 前言 上一篇文章刚给大家总结完,关于上传头像的功能.此文章所述 主要是关于上传头像的具体流程以及如何对照片做裁剪处理,回调给控件显示:当然重中之重 ...

最新文章

  1. 【论文理解】ArcFace: Additive Angular Margin Loss for Deep Face Recognition(InsightFace)
  2. JavaScript跨域方法
  3. Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】
  4. htmlcss实例小项目_HTMLCSS学习笔记(十九)-- 媒体查询
  5. Hive体系结构(二)Hive的执行原理、与关系型数据库的比较
  6. 使用Netbeans开发App Engine Java
  7. cal css,CSS calc计算属性
  8. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)
  9. 计算机缺考学校知道吗,计算机二级机考缺考成绩单会不会显示缺考啊
  10. 【Python笔记】正则表达式
  11. 计算机控制系统功能,计算机控制系统功能之操作指导-电脑自学网
  12. 蓝墨云活动三种查找算法练习的分析博客
  13. selenium系列--测试脚本--将Excel文件用于测试(unittest数据驱动实战)
  14. Java自定义生成PDF报告
  15. 谷歌浏览器安装插件失败的解决方案
  16. Fibonacci费氏数列
  17. 注意力、自注意力和多头注意力
  18. SIM卡PIN码管理
  19. google-auto之自动生成组件化文件
  20. 适用于 Flutter 的 Google 移动广告 SDK 正式版现已发布

热门文章

  1. CAN通信稳定性开发分析
  2. limt mysql操作
  3. android脚本 附近的人,安卓引流脚本好用吗,附近的人引流脚本的功能你知道几个?...
  4. c语言指针学多久,C语言指针难学吗?
  5. jsmap(桔色棉袄配什么颜色打底衫)
  6. R语者小case之——巧用table函数做多变量分类统计
  7. [转]设置IE背景色保护你的眼睛视力_鹤壁吧_贴吧
  8. 叉积的证明_矢量叉乘分配律的几何证明
  9. todo有android版本吗,高效todo手机app下载
  10. Css3模拟彩色灯光