調(diào)用相機(jī)

目前很多APP都用到相機(jī)相冊(cè),最常見(jiàn)的就是用戶設(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);
                }
//啟動(dòng)相機(jī)
                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(),方法是獲得手機(jī)的關(guān)聯(lián)緩存目錄,具體的路徑是sdcard/Android/data/包名/cache,我們之所以使用這個(gè)關(guān)聯(lián)緩存,是因?yàn)锳ndroid6.0引入的運(yùn)行時(shí)權(quán)限,而SD被列為危險(xiǎn)權(quán)限,為了跳過(guò)這一步。
              //獲得URI
              if (Build.VERSION.SDK_INT >= 24) {
                  uriForFile = FileProvider.getUriForFile(MainActivity.this, "com.example.aa.fileprovider", outimage);
              } else {
                  uriForFile = Uri.fromFile(outimage);
              }
        這段代碼,做了一個(gè)判斷,Android7.0就是用FileProvider.getUriForFile  得到一個(gè)封裝的uri對(duì)象,第三個(gè)參數(shù)是任意的唯一字符串 之所以這樣做,這里主要是因?yàn)锳ndroid7.0下使用本地真實(shí)路徑被認(rèn)為是不安全的,如果是7.0以前的版本,那么就是用fromFile得到一個(gè)uri對(duì)象,這個(gè)對(duì)象就包含了對(duì)應(yīng)的文件地址。 前面的fileProvider是一個(gè)特殊的內(nèi)容提供器,和內(nèi)容提供者類似的機(jī)制,可以對(duì)封裝的URI共享給外部訪問(wèn),從而提高應(yīng)用的安全性。
     要在清單文件中注冊(cè)內(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()第二個(gè)參數(shù)一致, 還要在里面指定一個(gè)共享路徑:

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 屬性隨意寫,后面值不寫代表整個(gè)SDCard,很多時(shí)候還有從相冊(cè)選取的功能,見(jiàn)下一遍文章。
      項(xiàng)目地址:https://github.com/zh2016hz/CameraDemo.git
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容