?????在Android原生態(tài)開發(fā)過程中,往往會設(shè)計到用戶頭像的設(shè)置問題,一般來講設(shè)置頭像需要用到拍照、獲取照片、存儲照片、裁剪照片、顯示照片等問題,本文將一步一步的進行說明講解。
首先需要強調(diào)幾點我在開發(fā)過程中遇到的問題。
- 權(quán)限問題,在Android6.0以后,Android的權(quán)限獲取不再是通過AndroidManifest.xml文件中聲明獲取,為了安全行,APP獲取Android的高位權(quán)限需要動態(tài)獲取。系統(tǒng)權(quán)限默認是禁止的,需要申請。動態(tài)申請權(quán)限的說明見該文章
- 調(diào)用順序問題,在開發(fā)過程中一定要注意代碼的執(zhí)行順序,一定要在用戶獲取指定權(quán)限之后再調(diào)用相關(guān)功能,注意權(quán)限的調(diào)用和授權(quán)是異步于主線程的,也就是說,如果你在調(diào)用權(quán)限后緊跟著調(diào)用相機的操作的還,系統(tǒng)會導(dǎo)致閃退,因為調(diào)用權(quán)限后主線程并沒有等待授權(quán)完成而繼續(xù)執(zhí)行,這就導(dǎo)致在調(diào)用相機時沒有權(quán)限。
- Uri和Bitmap的區(qū)別以及使用,在使用裁剪功能時,我們通常使用Uri對象來指明資源,Bitmap占用內(nèi)存而且效率低下,但是使用Uri的過程中需要注意,如果我們在調(diào)用裁剪功能前就指明了Uri參數(shù),那么返回的Intent對象中的getData方法將返回為null。
- Android系統(tǒng)路徑及存儲空間問題,Android分為內(nèi)部存儲和外部存儲,而且在Android開發(fā)過程中設(shè)計到大量路徑問題,Android內(nèi)外部存儲及路徑問題見該文章
下面進行具體的功能實現(xiàn)。
1.權(quán)限設(shè)置
?????在該功能的開發(fā)過程中需要使用到相機權(quán)限、存儲空間讀寫權(quán)限。
?????權(quán)限獲取可以大致分為兩部:在manifest文件中聲明權(quán)限,在activity中動態(tài)獲取權(quán)限。
- manifest文件的設(shè)置
<!-- 讀寫權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 相機權(quán)限 -->
<uses-permission android:name="android.permission.CAMERA"/>
- 在Java代碼中動態(tài)申請權(quán)限
動態(tài)申請權(quán)限代碼一般放在程序運行的首界面,在首界面運行時就向用戶申請需要的各種權(quán)限,而在動態(tài)申請的過程中,又需要實現(xiàn)兩步:申請權(quán)限和處理用戶授權(quán)信息。
申請權(quán)限的代碼
//一下代碼可以直接在首頁面中的onCreate方法中調(diào)用requestPermission()
//申請權(quán)限返回碼
private final int REQUEST_PERMISSION_CODE = 0x01;
//可以使用Manifest.permission.***表示
private final String[] permissions = new String[]{
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.CAMERA"};
/**
* 動態(tài)申請權(quán)限
*/
private void requestPermission() {
List<String> requestPermissions = new ArrayList<>();
for (String permission:permissions) {
//判斷用戶是否已經(jīng)授權(quán)
if (ContextCompat.checkSelfPermission(this,
permission) != PackageManager.PERMISSION_GRANTED){
//如果用戶沒有授權(quán)
requestPermissions.add(permission);
}
}
/**
* 用戶動態(tài)授權(quán)
* 執(zhí)行該代碼后,將進入授權(quán)界面,此時主線程繼續(xù)執(zhí)行
* 用戶授權(quán)結(jié)果將被onRequestPermissionsResult方法接受,如果需要處理則重寫該方法
*/
if(requestPermissions.size() != 0){
String[] strs = requestPermissions.toArray(new String[requestPermissions.size()]);
ActivityCompat.requestPermissions(this, strs, REQUEST_PERMISSION_CODE);
}
}
處理授權(quán)結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-636709.html
/**
* @param requestCode The request code passed in {@link #requestPermissions(String[], int)}.
* @param permissions The requested permissions. Never null.
* @param grantResults The grant results for the corresponding permissions
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//授權(quán)結(jié)果的處理邏輯
}
?????上述過程完成了權(quán)限申請過程,如果用戶授權(quán)允許調(diào)用相機,則后續(xù)可以直接調(diào)用相機進行相關(guān)操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-636709.html
到了這里,關(guān)于Android 設(shè)置頭像(拍照獲取、相冊獲取、裁剪照片)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!