Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android-調用系統的ContentPrivder獲取單張圖片實現剪切做頭像及源碼下載

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

編輯:關於Android編程

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

首先看看效果圖:
打開app,進入注界面,點擊獲取圖片按鈕

調用系統的圖片選擇器,選擇圖庫,

點擊圖片,返回獲取到圖片

點擊剪切圖片按鈕,調用系統的圖片剪切工具

獲取到剪切之後的圖片

下面具體請看代碼:

public class MainActivity extends Activity implements OnClickListener{

    private TextView backTx,sureTx;//一個返回鍵,一個確定鍵
    private ImageView imageView;//顯示獲取的圖片的ImageView
    private Button getPic,getPic2Cut;
    //兩個按鈕,分別實現獲取圖片、對圖片進行剪切
    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);
    }
    //調用系統相冊獲取圖片的方法,非常簡單
    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即可。
             * 不過這種方式當圖片很大的時候,容易出現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);
         }
}

上面代碼獲取返回值的過程中,使用了三種方法,具體實現的時候只是用一種方法即可。推薦使用第三種方式。
值得一提的是,該小項目需要在配置文件中加入一下權限值:

沒有此權限則報錯!

該小項目非常實用,大部分app中都有獲取用戶頭像、進行用戶頭像的設置的操作,所以大家可以參考,如果有什麼不對的地方,請大家積極留言交流,共同進步!謝謝~!【握手】

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved