1. 程式人生 > >Android 從相簿或者拍照設定頭像,相容Android6.0後許可權問題

Android 從相簿或者拍照設定頭像,相容Android6.0後許可權問題

                                    平時開發中我們會需要設定使用者頭像 

從手機相簿或者拍照設定,在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.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) { 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" />