2018-05-27

頭像選取的兩種方式 拍照和系統(tǒng)相冊選取

QQ圖片20180527222039.jpg

點(diǎn)擊用戶頭像暗赶,彈出選擇框昼榛,讓用戶選擇 拍照選取 還是相冊選取锌雀。

下面的代碼是彈出選擇框

private void initMyPhoto() {
        //彈出選擇框
        String[] strings = {"拍照", "從相機(jī)選擇"};
        yourchoice = 0;
        AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MeInformActivity.this);
        singleChoiceDialog.setTitle("請選擇頭像");
        singleChoiceDialog.setSingleChoiceItems(strings, 0, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                yourchoice = which;
            }
        });
        singleChoiceDialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (yourchoice == 0) {
                    //拍照
                    chooseCameraphoto();
                } else if (yourchoice == 1) {
                    //從相機(jī)選擇照片
                    chooseLocalphoto();
                }
            }

        });
        singleChoiceDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        singleChoiceDialog.show();
    }

然后定義兩個(gè)作為請求碼的常量和一個(gè)圖片的uri,后面會(huì)用到

 /* 請求識別碼 */
    private static final int CODE_GALLERY_REQUEST = 0xa0;
    private static final int CODE_CAMERA_REQUEST = 0xa1;
 /* 圖片的uri路徑 */
    private Uri uri;

下面代碼是用相機(jī)拍照選取頭像

 private void chooseCameraphoto() {
        //新建一個(gè)臨時(shí)文件存放圖片
        File outputFile =  new File(getExternalCacheDir(),
                "newFile.jpg");
        try {
            if(outputFile.exists()){
                outputFile.delete();
           }
            outputFile.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 判斷存儲(chǔ)卡是否可用翰绊,存儲(chǔ)照片文件
        if (hasSdcard()) {
            uri = getUriForFile(MeInformActivity.this,outputFile);
            intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,  getUriForFile(MeInformActivity.this,outputFile));
        }
        startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
    }

下面代碼是判斷存儲(chǔ)卡是否可用

private boolean hasSdcard() {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            // 有存儲(chǔ)的SDCard
            return true;
        } else {
            return false;
        }
    }

下面代碼是根據(jù)file對象返回一個(gè)系統(tǒng)的Uri對象

  private static Uri getUriForFile(Context context, File file) {
        if (context == null || file == null) {
            throw new NullPointerException();
        }
        Uri uri;
        if (Build.VERSION.SDK_INT >= 24) {
            uri = FileProvider.getUriForFile(context.getApplicationContext(), "com.example.onlineclassroom.fileprovider", file);
            Log.e("uri",uri+"");
        } else {
            uri = Uri.fromFile(file);
        }
        return uri;
    }

當(dāng)調(diào)用 FileProvider.getUriForFile的內(nèi)容提供器的時(shí)候佩谷,我們要提前在manifests里面聲明內(nèi)容提供器,代碼如下

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

上面引用到的file_paths的文件如下

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <external-path  name="files_path" path="/"/>
</paths>

下面代碼打開系統(tǒng)相冊選取頭像

 private void chooseLocalphoto() {
        /*
        從android6.0(API級別23)開始,系統(tǒng)權(quán)限分為兩類:正常權(quán)限和危險(xiǎn)權(quán)限讀寫內(nèi)存卡被識別為危險(xiǎn)操作谐檀,    
        所以需要?jiǎng)討B(tài)向用戶請求訪問內(nèi)存的權(quán)限
        具體的步驟
        (1) 調(diào)用ContextCompat.checkSelfPermission() 方法檢查用戶是否具有這樣的權(quán)限
        (2) 調(diào)用requestPermissions() 方法請求權(quán)限抡谐,,系統(tǒng)將向用戶顯示一個(gè)對話框
        (3) 當(dāng)用戶響應(yīng)時(shí)桐猬,系統(tǒng)將調(diào)用應(yīng)用的 onRequestPermissionsResult() 方法
         */
        int permissionCheck = ContextCompat.checkSelfPermission(MeInformActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        Log.e("permissionCheck",permissionCheck+"");
        if(permissionCheck == -1) {
            //當(dāng)沒有權(quán)限
            ActivityCompat.requestPermissions(MeInformActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        }else{
            //當(dāng)有權(quán)限
            Intent intentFromGallery = new Intent();
            // 設(shè)置文件類型
            intentFromGallery.setType("image/*");
            //ACTION_GET_CONTENT:允許用戶選擇特殊種類的數(shù)據(jù)麦撵,并返回(特殊種類的數(shù)據(jù):照一張相片或錄一段音)
            intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
        }
    }

下面是動(dòng)態(tài)申請權(quán)限

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //當(dāng)獲得權(quán)限后再調(diào)用系統(tǒng)相冊
                    chooseLocalphoto();
                }
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

下面代碼 根據(jù)請求碼的不同執(zhí)行不同的操作

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        switch (requestCode) {
            case CODE_GALLERY_REQUEST:
                //調(diào)用本地相冊
                if(intent != null){
                     //系統(tǒng)返回的是一個(gè)媒體文件的Uri,我們需轉(zhuǎn)換成真實(shí)的圖片路徑
                    String imagePath = handleImageOnKitKat(intent);
                    Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
                    header_im1.setImageBitmap(bitmap); 
                }
                break;
            case CODE_CAMERA_REQUEST:
                //拍照
                //拍照返回的是一個(gè)file類型溃肪,所以直接調(diào)用getPath方法則返回真實(shí)路徑
                String imagePath2 = uri.getPath();
                Bitmap bitmap2 = BitmapFactory.decodeFile(imagePath2);
                header_im1.setImageBitmap(bitmap2);
                break;
        }
        super.onActivityResult(requestCode, resultCode, intent);
    }

以上就是選擇頭像的所有代碼了厦坛,如有幫助請點(diǎn)個(gè)贊吧!UЬ杜秸!
如有問題,歡迎留言討論H笠铩G说!

以上代碼參考了 《第一行代碼》 郭霖

下一篇 將會(huì)介紹如何 高效加載大圖片莉撇,防止程序OOM

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呢蛤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棍郎,更是在濱河造成了極大的恐慌其障,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涂佃,死亡現(xiàn)場離奇詭異励翼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辜荠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門汽抚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伯病,你說我怎么就攤上這事造烁。” “怎么了午笛?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵惭蟋,是天一觀的道長。 經(jīng)常有香客問我药磺,道長告组,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任与涡,我火速辦了婚禮惹谐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驼卖。我一直安慰自己氨肌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布酌畜。 她就那樣靜靜地躺著怎囚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桥胞。 梳的紋絲不亂的頭發(fā)上恳守,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音贩虾,去河邊找鬼催烘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缎罢,可吹牛的內(nèi)容都是我干的伊群。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼策精,長吁一口氣:“原來是場噩夢啊……” “哼舰始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咽袜,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤丸卷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后询刹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜嫉,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年凹联,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骄恶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匕垫,死狀恐怖僧鲁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情象泵,我是刑警寧澤寞秃,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站偶惠,受9級特大地震影響春寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忽孽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一绑改、第九天 我趴在偏房一處隱蔽的房頂上張望谢床。 院中可真熱鬧,春花似錦厘线、人聲如沸识腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渡讼。三九已至,卻和暖如春耳璧,著一層夾襖步出監(jiān)牢的瞬間成箫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工旨枯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹬昌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓攀隔,卻偏偏與公主長得像凳厢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子竞慢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,858評論 25 707
  • 昨日做下的事: 參加預(yù)售前的要新電培訓(xùn)先紫。 參加FT預(yù)售小隊(duì)的內(nèi)部會(huì)議。 制作一個(gè)北京生活的視頻筹煮。 寫一篇日記總結(jié)遮精。...
    文建偉CZYH閱讀 275評論 0 0
  • 幼兒園,小學(xué)败潦,初中本冲,高中,大學(xué)劫扒,但凡生活在有人的地方檬洞,就總覺得有人過得比我好 。幼兒園的時(shí)候沟饥,隔桌的小孩有最新的玩...
    bluebooks閱讀 295評論 0 0
  • 你有婉約之美 你吞下整片月光皎潔 第四夜 你是一顆不可名狀的刺 開在野菊花的下顎 金色如此不著邊際 一顆石子 就足...
    草夫閱讀 194評論 1 0