使用Android系統(tǒng)相機捕獲圖片(三)

寫文章的目的

  1. 靜下心來學(xué)習(xí)
  2. 知識點的積累
  3. 總結(jié)似嗤,做筆記

導(dǎo)讀

解決上一篇文章留下的問題使用Android系統(tǒng)相機捕獲圖片(二)

需求

  • 在高版本手機上淡诗,使用Android系統(tǒng)相機捕獲圖片(大圖)旱物。

問題

  1. 在Android6.0以上需要動態(tài)的申請讀寫權(quán)限READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

2.直接將上一篇的項目運行在Android7.0的手機上會直接報錯:FileUriExposedException: file:///storage/emulated/0/rflashmy.jpg exposed beyond app through ClipData.Item.getUri()侥祭。

代碼解構(gòu)

1.動態(tài)申請權(quán)限。

  • 步驟1:在AndroidManifest.xml中注冊讀寫權(quán)限
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 步驟2:判斷讀寫權(quán)限是否申請。
  /**
     * 檢查權(quán)限是否申請
     *
     * @param permission 權(quán)限
     * @return true :權(quán)限已申請
     */
    private boolean checkPermission(String permission) {
        //是否申請權(quán)限
        boolean hasPermission = false;
        //通過api去校驗權(quán)限是否申請卑硫,返回判斷標(biāo)志
        int i = ContextCompat.checkSelfPermission(this, permission);
        if (PackageManager.PERMISSION_GRANTED == i) {
            //PERMISSION_GRANTED表示權(quán)限已申請
            hasPermission = true;
        } else if (PackageManager.PERMISSION_DENIED == i) {
            //PERMISSION_DENIED表示權(quán)限未申請
            hasPermission = false;
        }
        return hasPermission;

    }
  • 步驟3:申請權(quán)限。
  /**
     * 請求權(quán)限
     */
    private void requestPermission(String... permission) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission[0])) {
            //shouldShowRequestPermissionRationale()方法解釋
            //1.第一次請求該權(quán)限蚕断,返回false
            //2.請求過該權(quán)限并被用戶拒絕欢伏,返回true
            //3.請求過該權(quán)限,但用戶拒絕的時候勾選不再提醒亿乳,返回false硝拧。
            //總結(jié)一下,這個方法的目的:就是說去告訴用戶葛假,為什么需要用戶同意該權(quán)限障陶。
            //todo 所以這里可以給一個ui提示用戶同意權(quán)限的好處。
            //我這里只是toast聊训”Ь浚可以理解為偽代碼,只是提供一種思路
            Toast.makeText(this, "求求你授權(quán)吧带斑!", Toast.LENGTH_SHORT).show();
            //提示之后可以繼續(xù)請求權(quán)限
            ActivityCompat.requestPermissions(this, permission, PERMISSION_RESULT);
        } else {
            //沒有權(quán)限鼓寺,去請求權(quán)限
            ActivityCompat.requestPermissions(this, permission, PERMISSION_RESULT);
        }
    }
  • 步驟4:回調(diào)結(jié)果中處理權(quán)限。
     /**
     * 讀寫權(quán)限
     */
    private final String mPermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode != PERMISSION_RESULT) {
            return;
        }

        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //因為我就申請一個權(quán)限勋磕,所以可以通過grantResults[0]就是我申請的權(quán)限妈候。
            //用戶同意權(quán)限,打開相機
            openCameraForResult();
        }else {
            //這里本意并不是重新請求權(quán)限挂滓,是通過方法shouldShowRequestPermissionRationale()去給用戶做提示苦银。
            requestPermission(mPermission);
        }
    }

2.檢驗權(quán)限代碼是否能獲取權(quán)限。在 button點擊事件里面調(diào)用獲取權(quán)限方法赶站。會發(fā)現(xiàn)點擊完全沒反應(yīng)(手機:一加5T幔虏,系統(tǒng)版本7.1)。是代碼有問題嗎贝椿?之后我換成ACCESS_COARSE_LOCATION所计,發(fā)現(xiàn)彈出了需要用戶授權(quán)的dialog。what the fuck?

Screenshot_20181109-095322.jpg

3.也就是說代碼沒問題团秽,之后我換了小米手機主胧,發(fā)現(xiàn)是需要獲取權(quán)限的。
4.這下好了權(quán)限也解決了习勤,接下來就是解決Android 7.0上報錯FileUriExposedException踪栋。這是因為Android 7.0以后不能識別以file://開頭的Uri。也就是說在不同版本需要構(gòu)建不同的Uri图毕。

  • 步驟一:res目錄下創(chuàng)建xml資源文件夾(如果有不必建)夷都,然后創(chuàng)建一個xml文件(以file.xml為例)。

    image.png

  • 步驟二:完成files.xml予颤。還記得我們需要把拍照圖片存在哪嗎囤官?Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"冬阳。那么對應(yīng)的xml文件:

    <!--external-path 對應(yīng)的是Environment.getExternalStorageDirectory()-->
    <!--name 我的理解是Uri上的名字-->
    <!--path 就是圖片存儲的真實路徑-->
    <!--可以通過生成的Uri去理解這下值-->
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="image"
        path="rflash" />
</paths>
  • 步驟三:在AndroidManifest.xmlapplication標(biāo)簽里面添加provider標(biāo)簽。
  <!--authorities 對應(yīng)值不一定非是applicationId-->
  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.rflash.captrueimage03"
            android:exported="false"
            android:grantUriPermissions="true">
             <!--resource 對應(yīng)值是剛剛構(gòu)建的files.xml-->
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/files" />
        </provider>
  • 步驟四:java代碼中構(gòu)建Uri党饮。
 /**
     * 獲取圖片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        //###下面代碼有些手機需要(如:小米手機)###
        //可以試下去掉下面的代碼在小米手機上報什么錯
        File parentFile = file.getParentFile();
        //去創(chuàng)建圖片存放的父路徑
        if (!parentFile.exists()){
            parentFile.mkdirs();
        }
        //###上面面代碼有些手機需要(如:小米手機)###
        Uri imageUri;
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
            //N以前
            imageUri = Uri.fromFile(file);
        } else {
            //N以后肝陪,通過FileProvider生成
            //特別地,第二個參數(shù)authority對應(yīng)AndroidManifest.xml下provider標(biāo)簽里面的authorities值刑顺。
            //我直接使用的application_id
            imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file);
            Log.i("---", imageUri.toString());
            //打印結(jié)果
            //I/---: content://com.rflash.captrueimage03/image/my.jpg
        }
        return imageUri;
    }

5.小結(jié)下氯窍,權(quán)限問題7.0上Uri問題都已經(jīng)解決,接下來調(diào)用系統(tǒng)相機蹲堂。直接上代碼(與上一篇調(diào)用是一樣的)狼讨。

 /**
     * 打開相機
     */
    private void openCameraForResult() {
        //創(chuàng)建intent ,設(shè)置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //構(gòu)建圖片路徑
        createImageFilePath();
        //將捕獲的圖片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //調(diào)用相機
        startActivityForResult(intent, IMAGE_RESULT);
    }

6.拿到圖片并顯示(顯示結(jié)果就不截圖了)柒竞。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == IMAGE_RESULT) {
            //這里不能通過Intent對象去獲取"data"政供,
            // 因為在打開相機時已經(jīng)通過MediaStore.EXTRA_OUTPUT告訴相機:你把圖片放在我傳給你的Uri中
            //所以可以直接通過BitmapFactory在存儲路徑中獲取圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }

總結(jié)

1.調(diào)用系統(tǒng)相機捕獲圖片,需要注意:不同版本需要構(gòu)建不同的Uri朽基,具體區(qū)分是Android.N鲫骗。在N以前可以直接使用Uri.fromFile(file)創(chuàng)建Uri,在N以后需要通過FileProvider踩晶,具體步驟文章上面有执泰。
2.特別注意:有些手機需要手動給圖片創(chuàng)建父路徑。
3.那么渡蜻,獲取了這么大的圖片并顯示术吝,內(nèi)存肯定消耗很大,有什么優(yōu)化嗎茸苇?請聽下回分解排苍。

代碼樣例

1.res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="capture_image"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn" />


</android.support.constraint.ConstraintLayout>

2.MainActivity.java

package com.rflash.captrueimage03;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
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 button;
    private ImageView imageView;

    /**
     * 打開系統(tǒng)相機的requestCode
     */
    private final int IMAGE_RESULT = 0;

    /**
     * 請求權(quán)限的requestCode
     */
    private final int PERMISSION_RESULT = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.btn);
        imageView = findViewById(R.id.iv);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btn:
                clickButton();
                break;
        }
    }

    /**
     * 點擊 capture_image button
     */
    private void clickButton() {
        if (!checkPermission(mPermission)) {
            requestPermission(mPermission);
        } else {
            //打開相機
            openCameraForResult();
        }
    }

    /**
     * 讀寫權(quán)限
     */
    private final String mPermission = Manifest.permission.WRITE_EXTERNAL_STORAGE;

    /**
     * 圖片存儲路徑
     */
    private String mImageFilePath;

    /**
     * 構(gòu)建圖片路徑
     * 將圖片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
     */
    private void createImageFilePath() {
        mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
    }

    /**
     * 獲取圖片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        //###下面代碼有些手機需要(如:小米手機)###
        //可以試下去掉下面的代碼在小米手機上報什么錯
        File parentFile = file.getParentFile();
        //去創(chuàng)建圖片存放的父路徑
        if (!parentFile.exists()){
            parentFile.mkdirs();
        }
        //###上面面代碼有些手機需要(如:小米手機)###
        Uri imageUri;
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
            //N以前
            imageUri = Uri.fromFile(file);
        } else {
            //N以后,通過FileProvider生成
            //特別地学密,第二個參數(shù)authority對應(yīng)AndroidManifest.xml下provider標(biāo)簽里面的authorities值淘衙。
            //我直接使用的application_id
            imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, file);
            Log.i("---", imageUri.toString());
            //打印結(jié)果
            //I/---: content://com.rflash.captrueimage03/image/my.jpg
        }
        return imageUri;
    }

    /**
     * 檢查權(quán)限是否申請
     *
     * @param permission 權(quán)限
     * @return true :權(quán)限已申請
     */
    private boolean checkPermission(String permission) {
        //是否申請權(quán)限
        boolean hasPermission = false;
        //通過api去校驗權(quán)限是否申請,返回判斷標(biāo)志
        int i = ContextCompat.checkSelfPermission(this, permission);
        if (PackageManager.PERMISSION_GRANTED == i) {
            //PERMISSION_GRANTED表示權(quán)限已申請
            hasPermission = true;
        } else if (PackageManager.PERMISSION_DENIED == i) {
            //PERMISSION_DENIED表示權(quán)限未申請
            hasPermission = false;
        }
        return hasPermission;

    }


    /**
     * 請求權(quán)限
     */
    private void requestPermission(String... permission) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission[0])) {
            //shouldShowRequestPermissionRationale()方法解釋
            //1.第一次請求該權(quán)限腻暮,返回false
            //2.請求過該權(quán)限并被用戶拒絕彤守,返回true
            //3.請求過該權(quán)限,但用戶拒絕的時候勾選不再提醒哭靖,返回false具垫。
            //總結(jié)一下,這個方法的目的:就是說去告訴用戶试幽,為什么需要用戶同意該權(quán)限筝蚕。
            //todo 所以這里可以給一個ui提示用戶同意權(quán)限的好處。
            //我這里只是toast∑鹂恚可以理解為偽代碼洲胖,只是提供一種思路
            Toast.makeText(this, "求求你授權(quán)吧!", Toast.LENGTH_SHORT).show();
            //提示之后可以繼續(xù)請求權(quán)限
            ActivityCompat.requestPermissions(this, permission, PERMISSION_RESULT);
        } else {
            //沒有權(quán)限坯沪,去請求權(quán)限
            ActivityCompat.requestPermissions(this, permission, PERMISSION_RESULT);
        }
    }

    /**
     * 打開相機
     */
    private void openCameraForResult() {
        //創(chuàng)建intent 绿映,設(shè)置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //構(gòu)建圖片路徑
        createImageFilePath();
        //將捕獲的圖片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //調(diào)用相機
        startActivityForResult(intent, IMAGE_RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == IMAGE_RESULT) {
            //這里不能通過Intent對象去獲取"data",
            // 因為在打開相機時已經(jīng)通過MediaStore.EXTRA_OUTPUT告訴相機:你把圖片放在我傳給你的Uri中
            //所以可以直接通過BitmapFactory在存儲路徑中獲取圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode != PERMISSION_RESULT) {
            return;
        }

        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //因為我就申請一個權(quán)限屏箍,所以可以通過grantResults[0]就是我申請的權(quán)限。
            //用戶同意權(quán)限橘忱,打開相機
            openCameraForResult();
        } else {
            //這里本意并不是重新請求權(quán)限赴魁,是通過方法shouldShowRequestPermissionRationale()去給用戶做提示。
            requestPermission(mPermission);
        }
    }
}

3.res/xml/files.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--external-path 對應(yīng)的是Environment.getExternalStorageDirectory()-->
    <!--name 我的理解是Uri上的名字-->
    <!--path 就是圖片存儲的真實路徑-->
    <!--可以通過生成的Uri去理解這下值-->
    <external-path
        name="image"
        path="rflash" />
</paths>

4.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.rflash.captrueimage03">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <!--authorities 對應(yīng)值不一定非是applicationId-->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.rflash.captrueimage03"
            android:exported="false"
            android:grantUriPermissions="true">
            <!--resource 對應(yīng)值是剛剛構(gòu)建的files.xml-->
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/files" />
        </provider>
    </application>

</manifest>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钝诚,一起剝皮案震驚了整個濱河市颖御,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凝颇,老刑警劉巖潘拱,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拧略,居然都是意外死亡芦岂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門垫蛆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禽最,“玉大人,你說我怎么就攤上這事袱饭〈ㄎ蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵虑乖,是天一觀的道長懦趋。 經(jīng)常有香客問我,道長疹味,這世上最難降的妖魔是什么仅叫? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮糙捺,結(jié)果婚禮上惑芭,老公的妹妹穿的比我還像新娘。我一直安慰自己继找,他們只是感情好遂跟,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般幻锁。 火紅的嫁衣襯著肌膚如雪凯亮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天哄尔,我揣著相機與錄音假消,去河邊找鬼。 笑死岭接,一個胖子當(dāng)著我的面吹牛富拗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸣戴,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啃沪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窄锅?” 一聲冷哼從身側(cè)響起创千,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎入偷,沒想到半個月后追驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡疏之,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年殿雪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锋爪。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠摄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出几缭,到底是詐尸還是另有隱情河泳,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布年栓,位于F島的核電站拆挥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏某抓。R本人自食惡果不足惜纸兔,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望否副。 院中可真熱鬧汉矿,春花似錦、人聲如沸备禀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赋续,卻和暖如春男翰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纽乱。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工蛾绎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸦列。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓租冠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薯嗤。 傳聞我的和親對象是個殘疾皇子顽爹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 最近用到從系統(tǒng)圖庫和相機獲取圖片并裁剪當(dāng)頭像,根據(jù)郭霖大神的第一行代碼調(diào)用相機和圖冊应民,來進行擴展和總結(jié)话原。 1夕吻、獲取...
    axiaochao閱讀 2,569評論 0 5
  • 這篇文章分享我的 Android 開發(fā)(入門)課程 的最后一個實戰(zhàn)項目:貨物清單應(yīng)用诲锹。這個項目托管在我的 GitH...
    HsuJin閱讀 891評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,297評論 25 707
  • 經(jīng)常被問到如題這個問題,就想今天來寫一寫涉馅。以下內(nèi)容既是普及帖归园,也是廣告帖,慎入稚矿。 七年前庸诱,機緣巧合,轉(zhuǎn)行進入獵頭行...
    職場小能手Sara閱讀 395評論 0 3
  • 我原以為在這段算是我有生以來最難熬的時間里晤揣,總是熬一熬就能過去桥爽,在穩(wěn)定之后什么都塵埃落定了,才好想想以后的事昧识。卻沒...
    貓又閱讀 409評論 0 0