最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中通過訪問本地相冊或者相機(jī)設(shè)置用戶頭像實(shí)例

 更新時(shí)間:2017年01月09日 08:26:18   作者:潘侯爺  
本篇文章主要介紹了Android中通過訪問本地相冊或者相機(jī)設(shè)置用戶頭像,具有一定的參考價(jià)值,有興趣的可以了解一下。

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

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

(2)通過啟動(dòng)手機(jī)相機(jī),現(xiàn)拍圖片然后裁剪作為頭像。

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

這次我們簡單介紹下通過獲取本地相冊以及相機(jī)拍攝的方法設(shè)置頭像,實(shí)現(xiàn)思路如下:

(1)通過startActivityForResult方法,分別傳遞調(diào)用系統(tǒng)相冊的Intent和調(diào)用相機(jī)拍照的Intent來做選擇

(2)調(diào)用Android系統(tǒng)中自帶的圖片剪裁,實(shí)現(xiàn)圖片的剪裁并在onActivityResult方法中獲取數(shù)據(jù)。

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

     

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

java實(shí)現(xiàn)代碼如下:

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;
  //相機(jī)拍攝的頭像文件(本次演示存放在SD卡根目錄下)
  private static final File USER_ICON = new File(Environment.getExternalStorageDirectory(), "user_icon.jpg");
  //請求識別碼(分別為本地相冊、相機(jī)、圖片裁剪)
  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);
  }
  //設(shè)置點(diǎn)擊事件
  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.buttonLocal:
        //調(diào)用獲取本地圖片的方法
        getPicFromLocal();
        break;
      case R.id.buttonCamera:
        //調(diào)用相機(jī)拍照的方法
        getPicFromCamera();
        break;
      default:
        break;
    }
  }
  /**
   * 從本機(jī)相冊獲取圖片
   */
  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);
  }
  /**
   * 通過相機(jī)拍攝獲取圖片,
   * 并存入設(shè)置的路徑中
   */
  private void getPicFromCamera() {
    Intent intent = new Intent();
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    // 下面這句指定調(diào)用相機(jī)拍照后的照片存儲的路徑
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(USER_ICON));
    startActivityForResult(intent, CODE_CAMERA_REQUEST);
  }
  /**
   * 圖片裁剪
   *
   * @param uri
   */
  private void photoClip(Uri uri) {
    // 調(diào)用系統(tǒng)中自帶的圖片剪裁
    Intent intent = new Intent();
    intent.setAction("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    // 下面這個(gè)crop=true是設(shè)置在開啟的Intent中設(shè)置顯示的VIEW可裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是寬高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    /*outputX outputY 是裁剪圖片寬高
     *這里僅僅是頭像展示,不建議將值設(shè)置過高
     * 否則超過binder機(jī)制的緩存大小的1M限制
     * 報(bào)TransactionTooLargeException
     */
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CODE_PHOTO_CLIP);
  }
  /**
   * 提取保存裁剪之后的圖片數(shù)據(jù),并設(shè)置頭像部分的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) {
    // 用戶沒有進(jìn)行有效的設(shè)置操作,返回
    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);
  }
}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

新闻| 江津市| 塔河县| 宁武县| 武邑县| 原阳县| 察隅县| 襄垣县| 招远市| 井研县| 夏河县| 荣昌县| 罗定市| 河北省| 晴隆县| 潢川县| 竹山县| 梓潼县| 那坡县| 静宁县| 乐陵市| 娱乐| 厦门市| 承德县| 渭南市| 马山县| 泽普县| 曲沃县| 项城市| 腾冲县| 称多县| 靖宇县| 政和县| 齐齐哈尔市| 始兴县| 德庆县| 虞城县| 阳朔县| 天峻县| 镇雄县| 清涧县|