Android打開系統(tǒng)拍照&相冊(cè)獲取頭像

Android打開系統(tǒng)拍照&相冊(cè)獲取頭像

現(xiàn)在許多應(yīng)用都有上傳頭像的功能涛菠,再次奉上代開系統(tǒng)相冊(cè)或打開系統(tǒng)相機(jī)拍照的實(shí)現(xiàn),有的同學(xué)在測(cè)試小米手機(jī)上打開選擇相冊(cè)有奔潰,此代碼已完美解決此問題...

樓主,做的頭像需要經(jīng)過裁剪之后和圓形處理...

1.設(shè)置點(diǎn)擊打開相機(jī)&打開系統(tǒng)圖庫

                @Override
                public void onClick(View v) {
                    // 打開系統(tǒng)拍照程
                    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(camera, CAMERA);
                }
            

                @Override
                public void onClick(View v) {
                    // 打開系統(tǒng)圖庫選擇圖片
                    Intent picture = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(picture, PICTURE);
                }

2.重寫帶結(jié)果啟動(dòng)的回調(diào)onActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == CAMERA && resultCode == RESULT_OK && data != null) {

            // 拍照
            Bundle bundle = data.getExtras();
            // 獲取相機(jī)返回的數(shù)據(jù),并轉(zhuǎn)換為圖片格式
            Bitmap bitmap = (Bitmap) bundle.get("data");
            // bitmap圓形裁剪
//            bitmap = BitmapUtils.zoom(bitmap, DensityUtil.dp2px(this, 62), DensityUtil.dp2px(this, 62));
            bitmap = BitmapUtils.zoom(bitmap, DensityUtil.dp2px(this, 20), DensityUtil.dp2px(this, 20));
            Bitmap circleBitmap = BitmapUtils.circleBitmap(bitmap);

            //TODO 將圖片上傳到服務(wù)器
//            ivIcon.setImageBitmap(circleBitmap);
            uploadHeadpic(bitmap);
            // 將圖片保存在本地
            try {
                saveImage(circleBitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } else if (requestCode == PICTURE && resultCode == RESULT_OK && data != null) {
            //圖庫

            String pathResult = null;  // 獲取圖片路徑的方法調(diào)用
            try {
                Uri uri = data.getData();
                pathResult = getPath(uri);
                Log.e("TAG", "圖片路徑===" + pathResult);
            } catch (Exception e) {
                e.printStackTrace();
            }

            //這里返回的uri情況就有點(diǎn)多了
            //**:在4.4.2之前返回的uri是:content://media/external/images/media/3951或者file://....在4.4.2返回的是content://com.android.providers.media.documents/document/image:3951或者
            //總結(jié):uri的組成告抄,eg:content://com.example.project:200/folder/subfolder/etc
            //content:--->"scheme"
            //com.example.project:200-->"host":"port"--->"authority"[主機(jī)地址+端口(省略) =authority]
            //folder/subfolder/etc-->"path" 路徑部分
            //android各個(gè)不同的系統(tǒng)版本,對(duì)于獲取外部存儲(chǔ)上的資源,返回的Uri對(duì)象都可能各不一樣,所以要保證無論是哪個(gè)系統(tǒng)版本都能正確獲取到圖片資源的話
            //就需要針對(duì)各種情況進(jìn)行一個(gè)處理了

            Bitmap decodeFile = BitmapFactory.decodeFile(pathResult);
            Bitmap zoomBitmap = BitmapUtils.zoom(decodeFile, DensityUtil.dp2px(this, 20), DensityUtil.dp2px(this, 20));
            // bitmap圓形裁剪p
            Bitmap circleImage = BitmapUtils.circleBitmap(zoomBitmap);
            // 真實(shí)項(xiàng)目當(dāng)中嵌牺,是需要上傳到服務(wù)器的..這步我們就不做了打洼。
            uploadHeadpic(zoomBitmap);
            try {
                // 保存圖片到本地
                saveImage(circleImage);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

3.獲取圖片路徑

// 根據(jù)系統(tǒng)相冊(cè)選擇的文件獲取路徑
    @SuppressLint("NewApi")
    private String getPath(Uri uri) {
//        int sdkVersion = Build.VERSION.SDK_INT;
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // 高于4.4.2的版本
//        if (sdkVersion >= 19) {
        if (isKitKat && DocumentsContract.isDocumentUri(mContext, uri)) {
            Log.e("TAG", "uri auth: " + uri.getAuthority());
            if (isExternalStorageDocument(uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                String[] split = docId.split(":");
                String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(this, contentUri, null, null);
            } else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(this, contentUri, selection, selectionArgs);
            } else if (isMedia(uri)) {
                String[] proj = {MediaStore.Images.Media.DATA};
                Cursor actualimagecursor = this.managedQuery(uri, proj, null, null, null);
                int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                actualimagecursor.moveToFirst();
                return actualimagecursor.getString(actual_image_column_index);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(this, uri, null, null);

        } else if ("file".equalsIgnoreCase(uri.getScheme())) { // File
            return uri.getPath();
        }
        return null;
    }

private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    private boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    public static boolean isMedia(Uri uri) {
        return "media".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

以上就是比較完整的代碼了...

Thanks all.

本文首發(fā)于我的微信公眾號(hào),更多干貨文章逆粹,請(qǐng)掃描二維碼訂閱哦:


image

您可以掃描上面的二維碼募疮,來關(guān)注我的微信公眾號(hào),來學(xué)習(xí)更多的干貨文章枯饿!

另外酝锅,我還建了一個(gè)免費(fèi)的知識(shí)星球,感興趣的微信掃碼即可加入奢方!

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搔扁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蟋字,更是在濱河造成了極大的恐慌稿蹲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹊奖,死亡現(xiàn)場(chǎng)離奇詭異苛聘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忠聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門设哗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人两蟀,你說我怎么就攤上這事网梢。” “怎么了赂毯?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵战虏,是天一觀的道長拣宰。 經(jīng)常有香客問我,道長烦感,這世上最難降的妖魔是什么巡社? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮手趣,結(jié)果婚禮上晌该,老公的妹妹穿的比我還像新娘。我一直安慰自己回懦,他們只是感情好气笙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布次企。 她就那樣靜靜地躺著怯晕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缸棵。 梳的紋絲不亂的頭發(fā)上舟茶,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音堵第,去河邊找鬼吧凉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踏志,可吹牛的內(nèi)容都是我干的阀捅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼针余,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饲鄙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起圆雁,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤忍级,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后伪朽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴咱,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烈涮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴肺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坚洽,死狀恐怖戈稿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酪术,我是刑警寧澤器瘪,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布翠储,位于F島的核電站,受9級(jí)特大地震影響橡疼,放射性物質(zhì)發(fā)生泄漏援所。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一欣除、第九天 我趴在偏房一處隱蔽的房頂上張望住拭。 院中可真熱鬧,春花似錦历帚、人聲如沸滔岳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谱煤。三九已至,卻和暖如春禽拔,著一層夾襖步出監(jiān)牢的瞬間刘离,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工睹栖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硫惕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓野来,卻偏偏與公主長得像恼除,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曼氛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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