1. 程式人生 > >android-調用系統的ContentPrivder獲取單張圖片實現剪切做頭像及源代碼下載

android-調用系統的ContentPrivder獲取單張圖片實現剪切做頭像及源代碼下載

取消 點擊 mage 小項目 配置 count() attribute ppr cti

首先講述這個小項目的特色
1、調用系統的相冊應用獲取單張圖片
2、對單張圖片進行剪切方便做成指定大小的頭像圖片
3、對獲取圖片的結果進行解析,使用三種方式進行。

首先看看效果圖:
打開app,進入註界面。點擊獲取圖片button
技術分享
調用系統的圖片選擇器,選擇圖庫,
技術分享
點擊圖片。返回獲取到圖片
技術分享
點擊剪切圖片button,調用系統的圖片剪切工具
技術分享
獲取到剪切之後的圖片
技術分享
以下詳細請看代碼:

public class MainActivity extends Activity implements OnClickListener{

    private
TextView backTx,sureTx;//一個返回鍵,一個確定鍵 private ImageView imageView;//顯示獲取的圖片的ImageView private Button getPic,getPic2Cut; //兩個button,分別實現獲取圖片、對圖片進行剪切 private final int REQUEST = 11;//獲取圖片的請求值 private final int HEAD_IMAGE_ZOOM = 12;//圖片剪切的請求值 private Uri uri; private String TAG = MainActivity.class.getSimpleName(); @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); init(); setclickListener(); } private void init(){ backTx = (TextView) findViewById(R.id.cancle); sureTx = (TextView) findViewById(R.id.ok); imageView = (ImageView) findViewById(R.id.image); getPic = (Button) findViewById(R.id.get_pic); getPic2Cut = (Button) findViewById(R.id.get_pic_to_cut); } private
void setclickListener(){ backTx.setOnClickListener(this); sureTx.setOnClickListener(this); getPic.setOnClickListener(this); getPic2Cut.setOnClickListener(this); } //調用系統相冊獲取圖片的方法,很easy private void loadData(){ Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, REQUEST); } @Override protected void onDestroy() { super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.cancle: finish(); break; case R.id.ok: Toast.makeText(MainActivity.this, "圖片已經獲取到", Toast.LENGTH_SHORT).show(); break; case R.id.get_pic: loadData(); break; case R.id.get_pic_to_cut: startPhotoZoom(uri); break; } } @SuppressWarnings("deprecation") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST && resultCode == RESULT_OK) { uri = data.getData(); /** * 方法一: * 直接使用ImageView的方法設置圖片地址URI就可以。 * 只是這樣的方式當圖片很大的時候,easy出現OOM異常。慎用!

*/ imageView.setImageURI(uri); /** * 方法二: * 依據獲取的URI進行查詢,獲取到圖片後進行縮放,不會出現OOM異常 */ Cursor cursor = managedQuery(uri, null, null, null, null); if (cursor != null) { Log.i(TAG, "記錄數="+cursor.getCount()); if (cursor.moveToFirst()) { int index = cursor.getColumnIndexOrThrow(Media.DATA); String path = cursor.getString(index); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap bitmap = BitmapFactory.decodeFile(path, options); imageView.setImageBitmap(bitmap); } }else { Toast.makeText(MainActivity.this, "無法獲取圖片數據", Toast.LENGTH_SHORT).show(); } /** * 方法三: * 因為managedQuery這種方法已經不再推薦使用 * 故使用CursorLoader類完畢查詢操作 */ CursorLoader cursorLoader = new CursorLoader(MainActivity.this, uri, null, null, null, null); Cursor cursor2 = cursorLoader.loadInBackground(); if (cursor2 != null) { Log.i(TAG, "記錄數="+cursor2.getCount()); if (cursor2.moveToFirst()) { int index = cursor2.getColumnIndexOrThrow(Media.DATA); String path = cursor2.getString(index); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap bitmap = BitmapFactory.decodeFile(path, options); imageView.setImageBitmap(bitmap); } }else { Toast.makeText(MainActivity.this, "無法獲取圖片數據", Toast.LENGTH_SHORT).show(); } }else if (requestCode == HEAD_IMAGE_ZOOM && resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); if (bundle != null) { Bitmap bitmap = bundle.getParcelable("data"); imageView.setImageBitmap(bitmap); }else { Toast.makeText(MainActivity.this, "圖片剪切失敗", Toast.LENGTH_SHORT).show(); } }else if (requestCode == HEAD_IMAGE_ZOOM) { Toast.makeText(MainActivity.this, "圖片取消剪切", Toast.LENGTH_SHORT).show(); } } /** * 調用系統的程序進行圖片的剪切操作 * 獲取指定大小的剪切圖片,方便做成頭像 * @param uri */ private void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 以下這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 80); intent.putExtra("outputY", 80); intent.putExtra("return-data", true); startActivityForResult(intent, HEAD_IMAGE_ZOOM); } }

上面代碼獲取返回值的過程中,使用了三種方法,詳細實現的時候僅僅是用一種方法就可以。推薦使用第三種方式。
值得一提的是。該小項目須要在配置文件裏增加一下權限值:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

沒有此權限則報錯!

該小項目很有用。大部分app中都有獲取用戶頭像、進行用戶頭像的設置的操作,所以大家能夠參考,假設有什麽不正確的地方,請大家積極留言交流,共同進步。謝謝~!【握手】

源碼下載

android-調用系統的ContentPrivder獲取單張圖片實現剪切做頭像及源代碼下載