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

首頁 > 系統 > Android > 正文

Android中通過訪問本地相冊或者相機設置用戶頭像實例

2019-12-12 04:05:17
字體:
來源:轉載
供稿:網友

目前幾乎所有的APP在用戶注冊時都會有設置頭像的需求,大致分為三種情況:

(1)通過獲取本地相冊的圖片,經過裁剪后作為頭像。

(2)通過啟動手機相機,現拍圖片然后裁剪作為頭像。

(3)在APP中添加一些自帶的頭像資源,供用戶選擇(不夠人性化,目前很少使用)。

這次我們簡單介紹下通過獲取本地相冊以及相機拍攝的方法設置頭像,實現思路如下:

(1)通過startActivityForResult方法,分別傳遞調用系統相冊的Intent和調用相機拍照的Intent來做選擇

(2)調用Android系統中自帶的圖片剪裁,實現圖片的剪裁并在onActivityResult方法中獲取數據。

本次演示效果如下(分別為從本地相冊獲取以及從相機拍攝獲取頭像):

     

簡單布局文件這里不再做贅述,本次試驗使用隱式intent調用相機以及本地相冊,未在配置清單上添加權限,依然可以調用。

java實現代碼如下:

import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.io.File;public class MainActivity extends AppCompatActivity implements View.OnClickListener {  private Button buttonLocal, buttonCamera;  private ImageView imageView;  //相機拍攝的頭像文件(本次演示存放在SD卡根目錄下)  private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg");  //請求識別碼(分別為本地相冊、相機、圖片裁剪)  private static final int CODE_PHOTO_REQUEST = 1;  private static final int CODE_CAMERA_REQUEST = 2;  private static final int CODE_PHOTO_CLIP = 3;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    buttonLocal = (Button) findViewById(R.id.buttonLocal);    buttonCamera = (Button) findViewById(R.id.buttonCamera);    imageView = (ImageView) findViewById(R.id.imageView);    buttonLocal.setOnClickListener(this);    buttonCamera.setOnClickListener(this);  }  //設置點擊事件  @Override  public void onClick(View view) {    switch (view.getId()) {      case R.id.buttonLocal:        //調用獲取本地圖片的方法        getPicFromLocal();        break;      case R.id.buttonCamera:        //調用相機拍照的方法        getPicFromCamera();        break;      default:        break;    }  }  /**   * 從本機相冊獲取圖片   */  private void getPicFromLocal() {    Intent intent = new Intent();    // 獲取本地相冊方法一    intent.setAction(Intent.ACTION_GET_CONTENT);    intent.setType("image/*");    //獲取本地相冊方法二//    intent.setAction(Intent.ACTION_PICK);//    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//        "image/*");    startActivityForResult(intent, CODE_PHOTO_REQUEST);  }  /**   * 通過相機拍攝獲取圖片,   * 并存入設置的路徑中   */  private void getPicFromCamera() {    Intent intent = new Intent();    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);    // 下面這句指定調用相機拍照后的照片存儲的路徑    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON));    startActivityForResult(intent, CODE_CAMERA_REQUEST);  }  /**   * 圖片裁剪   *   * @param uri   */  private void photoClip(Uri uri) {    // 調用系統中自帶的圖片剪裁    Intent intent = new Intent();    intent.setAction("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 是裁剪圖片寬高     *這里僅僅是頭像展示,不建議將值設置過高     * 否則超過binder機制的緩存大小的1M限制     * 報TransactionTooLargeException     */    intent.putExtra("outputX", 150);    intent.putExtra("outputY", 150);    intent.putExtra("return-data", true);    startActivityForResult(intent, CODE_PHOTO_CLIP);  }  /**   * 提取保存裁剪之后的圖片數據,并設置頭像部分的View   */  private void setImageToHeadView(Intent intent) {    Bundle extras = intent.getExtras();    if (extras != null) {      Bitmap photo = extras.getParcelable("data");      imageView.setImageBitmap(photo);    }  }  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    // 用戶沒有進行有效的設置操作,返回    if (resultCode == RESULT_CANCELED) {      Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();      return;    }    switch (requestCode) {      case CODE_CAMERA_REQUEST:        if (USER_ICON.exists()) {          photoClip(Uri.fromFile(USER_ICON));        }        break;      case CODE_PHOTO_REQUEST:        if (data != null) {          photoClip(data.getData());        }        break;      case CODE_PHOTO_CLIP:        if (data != null) {          setImageToHeadView(data);        }        break;    }    super.onActivityResult(requestCode, resultCode, data);  }}

這里要注意的是在裁剪圖片時,長和寬不要設置太大,否則超過binder機制的緩存大小的限制(受手機配置影響).報TransactionTooLargeException,在代碼中已經做了詳細標注,請各位看官在實現的時候萬萬注意。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德昌县| 安国市| 扎兰屯市| 涟水县| 额尔古纳市| 海晏县| 六盘水市| 汝州市| 济源市| 台南市| 华宁县| 宁蒗| 横峰县| 通江县| 泾川县| 吉木萨尔县| 育儿| 什邡市| 额尔古纳市| 游戏| 霍邱县| 英超| 怀集县| 尼勒克县| 随州市| 新河县| 大埔县| 台山市| 贞丰县| 佛坪县| 镇雄县| 澄迈县| 兴城市| 磴口县| 乌鲁木齐市| 沙坪坝区| 乐清市| 儋州市| 兴安县| 太白县| 庆元县|