您的位置:首页 > 移动开发 > Android开发

Android 从相册或者拍照设置头像,兼容Android6.0后权限问题

2017-03-09 17:42 411 查看
                                    平时开发中我们会需要设置用户头像 

   从手机相册或者拍照设置,在Android6.0以前还不用考虑权限问题,到了6.0后还需要考虑权限问题,这里我们就来给大家一起处理下。有些可能不完善大家自己完善下。

  先直接上代码:

下面很多方法都有注释:

 1.其中 onActivityResult()是拍了照或者选取了手机照片中的回调。

 2 onRequestPermissionsResult() 是获取权限后返回当前界面的回调。

 

权限申请方法也在下面代码中

package com.example.chenzhu.myprojectblog;

import android.Manifest;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android
4000
.support.annotation.NonNull;
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.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 CameraActivity extends AppCompatActivity implements View.OnClickListener {
ImageView heardImage;
Button choceCamer;
Button choceIcon;
Uri imageUri; //图片路径
File imageFile; //图片文件
String imagePath;
Bitmap bitmapdown;
final  static  int  CAMERA =1;
final  static  int  ICON =2;
final  static  int  CAMERAPRESS =3;
final  static  int  ICONPRESS=4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
heardImage= (ImageView)findViewById(R.id.heardImage);
choceCamer = (Button)findViewById(R.id.choiceFromcamer);
choceCamer.setOnClickListener(this);
choceIcon = (Button)findViewById(R.id.choiceFromicon);
choceIcon.setOnClickListener(this);
}

public void  startCamera(){
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
imageFile = new File(path, "heard.png");
try {
if (imageFile.exists()) {
imageFile.delete();
}
imageFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//将File对象转换为Uri并启动照相程序
imageUri = Uri.fromFile(imageFile);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //照相
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //指定图片输出地址
startActivityForResult(intent, CAMERA); //启动照相
}

public void startIcon(){
Intent intent1 = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent1, ICON);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.choiceFromcamer:
if( Build.VERSION.SDK_INT>=23){
Toast.makeText(this,"当前的版本号"+Build.VERSION.SDK_INT,Toast.LENGTH_LONG).show();
//android 6.0权限问题
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},CAMERAPRESS);
Toast.makeText(this,"执行了权限请求",Toast.LENGTH_LONG).show();
}else {
startCamera();
}

}else {
startCamera();
}
break;

case R.id.choiceFromicon:
if( Build.VERSION.SDK_INT>=23){
Toast.makeText(this,"当前的版本号"+Build.VERSION.SDK_INT,Toast.LENGTH_LONG).show();
//android 6.0权限问题
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED   ){
Toast.makeText(this,"执行了权限请求",Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},CAMERAPRESS);
}else {
startIcon();
}

}else {
startIcon();
}

break;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("onActivityResult","requestCode"+requestCode+"resultCode"+resultCode);
switch (requestCode){
case CAMERA:
Bitmap bitmap1 = null;
try {
bitmap1 = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
imagePath = getPath(this, imageUri);
bitmapdown = bitmap1;
heardImage.setImageBitmap(bitmapdown);
} catch (FileNotFoundException e) {

10a3e
imageFile = null;
e.printStackTrace();
}
Log.d("chenzhu","imagePath"+imagePath);

break;
case ICON:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
String dst = getPath(this, data.getData());
imageFile = new File(dst);
imagePath = dst;
Bitmap bitmap = ThumbnailUtils.extractThumbnail(getBitmapFromFile(imageFile), 50, 50);
bitmapdown = bitmap;
heardImage.setImageBitmap(bitmapdown);
Log.d("chenzhu","imagePath"+imagePath);

break;

}

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case CAMERAPRESS:
if (grantResults[0]==PackageManager.PERMISSION_GRANTED&&grantResults[1]==PackageManager.PERMISSION_GRANTED){
//获取到了权限
startCamera();
}else {
Toast.makeText(this,"对不起你没有同意该权限",Toast.LENGTH_LONG).show();
}
break;

case ICONPRESS:
if (grantResults[0]==PackageManager.PERMISSION_GRANTED&&grantResults[1]==PackageManager.PERMISSION_GRANTED){
//获取到了权限
startIcon();
}else {
Toast.makeText(this,"对不起你没有同意该权限",Toast.LENGTH_LONG).show();
}
break;

}

}

public Bitmap getBitmapFromFile(File dst) {
if (null != dst && dst.exists()) {
BitmapFactory.Options opts = new BitmapFactory.Options();
//opts.inJustDecodeBounds = false;
opts.inSampleSize = 2;

try {
return BitmapFactory.decodeFile(dst.getPath(), opts);
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
}
return null;
}

public static String getPath(final Context context, final Uri uri) {

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}

// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {

final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}

final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};

return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {

// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();

return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}

public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {

Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};

try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}

/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}

}

    

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_camera"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.chenzhu.myprojectblog.CameraActivity">

<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/heardImage"
android:layout_centerInParent="true"
android:layout_width="200px"
android:layout_height="200px" />

<Button
android:text="照片设置"
android:id="@+id/choiceFromicon"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:text="相机设置"
android:id="@+id/choiceFromcamer"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />

</RelativeLayout>


注意需要在真机上测试。

记得还是不虚在清单文件中声明权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐