調(diào)用相機

目前很多APP都用到相機相冊,最常見的就是用戶設(shè)置自己頭像,使用的比較頻繁。還有就是QQ,微信的分享圖片.

package com.example.aa.cameral;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private ImageView img;
    private Uri uriForFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bt = (Button) findViewById(R.id.button);
        img = (ImageView) findViewById(R.id.imageView);
        bt.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                File outimage = new File(getExternalCacheDir(), "output_image.jpg");
                if (outimage.exists()) {
                    outimage.delete();
                }
                try {
                    outimage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //獲得URI
                if (Build.VERSION.SDK_INT >= 24) {
                    uriForFile = FileProvider.getUriForFile(MainActivity.this, "com.example.aa.fileprovider", outimage);
                } else {
                    uriForFile = Uri.fromFile(outimage);
                }
//啟動相機
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uriForFile);
                startActivityForResult(intent, 1);


            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            switch (requestCode) {
                case 1:
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uriForFile));
                        img.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    break;
            }
        }


    }
}

    上述代碼中的 getExternalCacheDir(),方法是獲得手機的關(guān)聯(lián)緩存目錄,具體的路徑是sdcard/Android/data/包名/cache,我們之所以使用這個關(guān)聯(lián)緩存,是因為Android6.0引入的運行時權(quán)限,而SD被列為危險權(quán)限,為了跳過這一步。
              //獲得URI
              if (Build.VERSION.SDK_INT >= 24) {
                  uriForFile = FileProvider.getUriForFile(MainActivity.this, "com.example.aa.fileprovider", outimage);
              } else {
                  uriForFile = Uri.fromFile(outimage);
              }
        這段代碼,做了一個判斷,Android7.0就是用FileProvider.getUriForFile  得到一個封裝的uri對象,第三個參數(shù)是任意的唯一字符串 之所以這樣做,這里主要是因為Android7.0下使用本地真實路徑被認為是不安全的,如果是7.0以前的版本,那么就是用fromFile得到一個uri對象,這個對象就包含了對應(yīng)的文件地址。 前面的fileProvider是一個特殊的內(nèi)容提供器,和內(nèi)容提供者類似的機制,可以對封裝的URI共享給外部訪問,從而提高應(yīng)用的安全性。
     要在清單文件中注冊內(nèi)容提供者:
  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.aa.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
    里面的屬性值 android:authorities="com.example.aa.fileprovider"必須和剛才的FileProvider.getUriForFile()第二個參數(shù)一致, 還要在里面指定一個共享路徑:

android:resource="@xml/file_paths",具體代碼如下

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="" />
</paths>
    里面name 屬性隨意寫,后面值不寫代表整個SDCard,很多時候還有從相冊選取的功能,見下一遍文章。
      項目地址:https://github.com/zh2016hz/CameraDemo.git
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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