国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 項目實戰之頭像選擇功能

2019-10-22 18:16:07
字體:
來源:轉載
供稿:網友

一、圖片選擇

1.1 目標

1.實現如圖所示功能:能夠出現相冊和相機選項

2.能夠對選擇的圖片進行裁剪

android,頭像選擇

1.2 功能實現

1.2.1 Intent工具類封裝

封裝圖片選擇和圖片裁剪的工具類

/**  * 選擇圖片(從相冊或相機)  * @param uri 相機存儲uri  * @return  */ public static Intent getPhotoSelectIntent(Uri uri){  Intent take = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  take.addCategory(Intent.CATEGORY_DEFAULT);  take.putExtra(MediaStore.EXTRA_OUTPUT, uri);  Intent pics = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  Intent chose= Intent.createChooser(pics,"選擇圖片");  chose.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{take});  return chose; } /**  * 圖片裁剪  * @param inputUri 需要裁剪的圖片  * @param outputUri 裁剪后存儲位置  * @param width 裁剪寬度  * @param height 裁剪高度  * @return  */ public static Intent getImageCropIntent(Uri inputUri, Uri outputUri, int width, int height) {  Intent intent = new Intent("com.android.camera.action.CROP");  intent.setDataAndType(inputUri, "image/*");  // 下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪  intent.putExtra("crop", "true");  intent.putExtra("scale", true); // 去黑邊  intent.putExtra("scaleUpIfNeeded", true); // 去黑邊  // aspectX aspectY 裁剪框寬高比例  intent.putExtra("aspectX", width); // 輸出是X方向的比例  intent.putExtra("aspectY", height);  // outputX outputY 輸出圖片寬高,切忌不要再改動下列數字,會卡死  intent.putExtra("outputX", width); // 輸出X方向的像素  intent.putExtra("outputY", height);  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());  intent.putExtra("noFaceDetection", true);  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);  intent.putExtra("return-data", false); // 設置為不返回數據  return intent; }

1.2.2 添加點擊圖片選擇事件

b.ivAvatar.setOnClickListener {   mTakePhotoFile = File(getPicPath() + File.separator + System.currentTimeMillis() + ".jpeg")   val uri = Uri.fromFile(mTakePhotoFile)   startActivityForResult(IntentUtils.getPhotoSelectIntent( uri), TAKE_PHOTO_REQ)  }

1.2.3 處理圖片選擇和裁剪反饋

圖片裁剪所需的Uri類似: content:// 的形式,因此需要封裝一個獲取content Uri的工具類

public static Uri getContentUri(Context context, File file) {  String filePath = file.getAbsolutePath();  Cursor cursor = context.getContentResolver().query(    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,    new String[] { MediaStore.Images.Media._ID },    MediaStore.Images.Media.DATA + "=? ",    new String[] { filePath }, null);  if (cursor != null && cursor.moveToFirst()) {   int id = cursor.getInt(cursor     .getColumnIndex(MediaStore.MediaColumns._ID));   Uri baseUri = Uri.parse("content://media/external/images/media");   return Uri.withAppendedPath(baseUri, "" + id);  } else {   if (file.exists()) {    ContentValues values = new ContentValues();    values.put(MediaStore.Images.Media.DATA, filePath);    return context.getContentResolver().insert(      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);   } else {    return null;   }  } }

處理反饋結果

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {  super.onActivityResult(requestCode, resultCode, data)  if(resultCode != -1) {   return  }  when (requestCode) {   TAKE_PHOTO_REQ -> {    // 處理圖片選擇結果    mCutPhotoFile = File(getPicPath() + File.separator + "avatar_" + System.currentTimeMillis() + "jpeg")    val cutUri = Uri.fromFile(mCutPhotoFile)    if (data != null){     startActivityForResult(IntentUtils.getImageCropIntent(data.data, cutUri, 200, 200), CUT_PHOTO_REQ)    } else {     val uri = UriUtils.getContentUri(applicationContext, mTakePhotoFile)     startActivityForResult(IntentUtils.getImageCropIntent(uri, cutUri, 200, 200), CUT_PHOTO_REQ)    }   }   CUT_PHOTO_REQ -> {    // 處理圖片裁剪結果   }  } }

1.2.4 Android 7.0適配

1. res/xml/provider_paths.xml路徑自行更換

<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path path="Android/data/com/example/sunmoon/images" name="sdcard_files" /> <external-files-path path="Android/data/com/example/sunmoon/images" name="camera_has_sdcard"/> <files-path path="Android/data/com/example/sunmoon/other"  name="camera_no_sdcard"/> <external-path path="Android/data/com/example/sunmoon" name="files_root" /> <external-path path="." name="external_storage_root" /></paths>

2. manifests配置包名自行更換

...<application>  <provider   android:name="android.support.v4.content.FileProvider"   android:authorities="com.example.sunmoon.provider"   android:exported="false"   android:grantUriPermissions="true">   <meta-data    android:name="android.support.FILE_PROVIDER_PATHS"    android:resource="@xml/provider_paths"/>  </provider> ...</application>...

總結

以上所述是小編給大家介紹的Android 項目實戰之頭像選擇功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉黎县| 彰武县| 奈曼旗| 临朐县| 佳木斯市| 锦州市| 股票| 卓资县| 绥江县| 宝鸡市| 盐山县| 军事| 阿拉善右旗| 乌鲁木齐县| 易门县| 本溪市| 清水河县| 鄂托克旗| 兴和县| 屯留县| 正定县| 桃园县| 从化市| 望城县| 南溪县| 安福县| 临邑县| 尚义县| 开江县| 高阳县| 乐至县| 宝鸡市| 城步| 保定市| 登封市| 五河县| 庐江县| 寻乌县| 永清县| 蓬溪县| 屏山县|