1. 程式人生 > >android呼叫系統相機拍照

android呼叫系統相機拍照

獲取縮圖

直接調取相機拍照,無需任何許可權,但是隻能獲取到縮圖

       Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       if (takePictureIntent.resolveActivity(getPackageManager()) != null) {//判斷是否有相機應用
           startActivityForResult(takePictureIntent, REQ_THUMB);
       }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult
(requestCode, resultCode, data); switch (requestCode) { case REQ_THUMB://返回結果 if (resultCode != Activity.RESULT_OK) return; Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); mImageView.setImageBitmap
(imageBitmap); break; } }

 圖片很模糊。一般不採取此種方式

儲存全尺寸照片

調取相機拍照儲存一個全尺寸的照片,必須提供完整的檔名,相機應用自動儲存照片。此時也無需任何許可權,建立一個空的臨時檔案用來儲存圖片,使用日期時間戳新照片返回一個唯一的檔名

    String mCurrentPhotoPath;
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new
SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; //.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/你的應用的包名/files/ 目錄,一般放一些長時間儲存的資料 File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); //建立臨時檔案,檔案字首不能少於三個字元,字尾如果為空預設未".tmp" File image = File.createTempFile( imageFileName, /* 字首 */ ".jpg", /* 字尾 */ storageDir /* 資料夾 */ ); mCurrentPhotoPath = "file:" + image.getAbsolutePath(); return image; }

每執行一次就會建立一個空的檔案

利用上述方法建立的檔案只能是自己的app訪問,隨著app的解除安裝,檔案也會刪除。對於Android N以下,檔案直接Uri.fromFile(file)就可以直接使用,Audroid N 即編譯app的版本 compileSdkVersion 24時,此時會報出FileUriExposedException異常,解釋如下:

  • 對於面向 Android N 的應用,Android 框架執行的 StrictMode,API 禁止向您的應用外公開 file://URI。
    如果一項包含檔案 URI 的 Intent 離開您的應用,應用失敗,並出現 FileUriExposedException異常。

  • 若要在應用間共享檔案,您應傳送一項 content://URI,並授予 URI 臨時訪問許可權。
    進行此授權的最簡單方式是使用 FileProvider類。 如需有關許可權和共享檔案的更多資訊,
    請參閱共享檔案

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {//判斷是否有相機應用
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();//建立臨時圖片檔案
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                //FileProvider 是一個特殊的 ContentProvider 的子類,
                //它使用 content:// Uri 代替了 file:/// Uri. ,更便利而且安全的為另一個app分享檔案
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.example.android.fileprovider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }

現在,需要配置FileProvider。在應用程式的清單,提供者新增到您的應用程式,authorities="applicationId.fileprovider",使用時

Uri photoURI = FileProvider.getUriForFile(context,"applicationId.fileprovider", photoFile)

清單中authorities 和 引數authority保持一致。

        <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.youga.capturingphotos.fileprovider"android:exported="false"android:grantUriPermissions="true">
            <meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/>
        </provider>
<?xml version="1.0" encoding="utf-8"?>
<pathsxmlns:android="http://schemas.android.com/apk/res/android">
    <external-pathname="my_images"path="Android/data/com.youga.capturingphotos.name/files/Pictures" />
</paths>
    @Override
    protectedvoidonActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQUEST_TAKE_PHOTO://返回結果
                if (resultCode != Activity.RESULT_OK) return;
                mImageView.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));
                break;
        }
    }

關於FileProvider

FileProvider 是 ContentProvider 的一個特殊的子類,它有利於安全地分享應用相關的檔案,通過對一個檔案建立content:// Uri而不是file:/// Uri

由於FileProvider的預設功能包括檔案的content URI的生成,你並不需要在程式碼中定義一個子類。相反,你可以在你的應用中包含一個FileProvider通過在XML檔案中指定它。對於指定FileProvider,新增一個<provider>元素在你應用的清單檔案中。設定android:name屬性為android.support.v4.content.FileProvider。根據你控制的域名設定android:authorities屬性為一個URI authority(authorities可以隨意填寫,但是要保證使用時與authority保持一致,推薦applicationId.fileprovider,以免定義重複)。設定android:exported屬性為false;FileProvider不需要公開。設定android:grantUriPermissions屬性為true,為了允許你進行臨時訪問檔案的授權。

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

一個FileProvider只能生成一個content URI 對應你事先指定目錄下的檔案。對於指定一個目錄,使用<paths>元素的子元素,在XML中指定它的儲存區域和路徑。例如,下面的paths元素告訴FileProvider你打算請求你的私有檔案區域的 images/ 子目錄的content URIs

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/com.youga.capturingphotos/files/Pictures/" />
    <external-path name="images" path="Pictures/" />
</paths>

file-path 表示你應用內部儲存區域的檔案的子目錄。這個子目錄和getFilesDir()的返回值一樣。external-path 表示你應用外部儲存區域的檔案的子目錄。這個子目錄和getExternalFilesDir()的返回值一樣。cache-path 表示你應用內部儲存區域的快取子目錄。這個子目錄的根目錄和getCacheDir()的返回值一樣。(如果你修改了provider和paths中的值,需要把應用解除安裝重灌或者開關機一下才能看到變化。)

照片新增到相簿

上述儲存全尺寸圖片時,建立圖片臨時檔案在目錄getExternalFilesDir()中,相簿無法訪問到,我們可以直接建立檔案在Environment.getExternalStorageDirectory()目錄下;然後傳送一個廣播讓相簿更新就好了。當然也可以直接建立檔案在相簿目錄下(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)),即DCIM。此時需要SD卡讀寫許可權。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
File path = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DCIM);
// Create an image file name
Log.i(TAG, "path:" + path.getAbsolutePath());
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date());
String imageFileName = "JPEG_" + timeStamp;
File image = File.createTempFile(
        imageFileName,  /* 字首 */
        ".jpg",         /* 字尾 */
        path      /* 資料夾 */
);
mPublicPhotoPath = image.getAbsolutePath();

同時傳送廣播

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mPublicPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);

相關推薦

android呼叫系統相機拍照

獲取縮圖 直接調取相機拍照,無需任何許可權,但是隻能獲取到縮圖 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivit

android 呼叫系統相機拍照,返回的data為null

最近做專案,需要拍照功能,於是就想簡單的呼叫系統相機來完成這一需求(當然,如果想要個性化一點的,也可以自定義camera去實現,這裡暫時不做)。 if(Environment.getExternalStorageState().equals(Environ

android 呼叫系統相機拍照後圖片上顯示文字

 先說說自己的思路(有什麼欠缺的望噴。。。)    1、在xml 檔案寫入Imageview(用來顯示拍照圖片) 和textview (顯示想要顯示的文字)  2、將xml 佈局通過   LayoutInflater.from(context).inflate轉換為view檢

解決Android呼叫系統相機拍照後相片無法在相簿中顯示問題

目前自己使用傳送廣播實現了效果public void photo() { Intent openCameraIntent = new Intent(android.provider.MediaSt

Android 呼叫系統相機拍照的返回結果

  1.開啟相機的Intent Action: MediaStore.ACTION_IMAGE_CAPTURE,下面為它的註釋: /** * Standard Intent action that can be sent to have the camera app

Android 呼叫系統相機拍照 . 選取本地相簿

專案中,基本都有使用者自定義頭像或自定義背景的功能,實現方法一般都是呼叫系統相機–拍照,或者系統相簿–選擇照片,然後進行剪裁,最終設為頭像或背景。 我直接貼上使用的程式碼吧! 這次偷懶了,沒有做效果圖,不過這是我試過的程式碼,可以,只不過不能選取原圖,因為

Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了: Error type 3 Error: Activity class {com.example.myapplication/com.example.myapplication

Android呼叫系統相機拍照 獲取原圖

拍照時候在onActivityResult中獲得相機拍照後點擊確定後的照片。 Android中用Intent提取縮圖和原始影象 可以接受照片的縮圖 Bundle bundle =data.ge

Android呼叫系統相機拍照並儲存到SD卡的兩種實現方式

1.呼叫照相機時通過putExtra的方式直接指定儲存路徑 String FilePath = "/sdcard/pic/"; File file = new File(FilePath); file.mkdirs();// 建立資料夾 Intent intent

總結Android呼叫系統相機拍照遇到的坑

拍照功能在應用開發中幾乎已成為標配,例如使用者通過拍照上傳頭像。實現拍照功能的方式有兩種。第一種是使用相機API(即Camera類)來自定義拍照,第二種是使用Intent呼叫系統相機來拍照。其中最常見的方式是直接呼叫系統相機拍照來獲取照片。 呼叫系統相機獲取照片的流程如下,

android 呼叫系統相機拍照的各種異常處理

1 本文只討論呼叫系統相機出現的異常解決辦法下面是呼叫系統相機的程式碼 先看一下最簡單的寫法 Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startAct

Android 呼叫系統相機拍照並且顯示在相簿中,以及中間可能會遇到的一些問題的解決

主要思路是在使用照相機拍照,然後為拍得的照片在SD卡新開一個儲存照片的檔案 程式碼:因為要呼叫照相機和SD卡所以需要新增以下許可權: 在manifests中新增 <uses-permission android:name="android.permission.CAM

解決Android呼叫系統相機連續拍照出現的記憶體溢位問題

記憶體溢位相信做過程式設計的人都知道一二,這裡說Android 記憶體溢位的問題:、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1後,拍照出現了Out

呼叫系統相機拍照為例瞭解Android 6.0執行時許可權

首先扯點別的,聽說這個週末是好天氣,想約她一起去公園賞賞梅花,只有我自己估計她也不一定去啊,哈哈。 在android6.0及以上系統,Android在安裝一個應用的時候不再需要列出一大堆許可權,讓使用者點選同意以後才可以安裝。Instead, 當應用在執行的時

Android 呼叫系統相機拍照,並上傳圖片所注意的一些問題

其實android拍照這個地方還是有很多注意事項的,我在上個專案中就遇到一些坑,因此我想把它記錄下來,希望能幫助一些跟我遇到的同樣的問題的人 如果你在專案中遇到以下問題: 通過系統路徑,拍出來的圖片不清楚 在某些情況下,onActivityResult

android呼叫系統相機實現拍照功能

在實現拍照的功能時遇到了很多問題,搜尋了很多資料,嘗試了很多辦法,終於解決了,下面簡要的描述下在開發過程中遇到的問題。 雖然之前看過android開發的書,但是沒有做過東西,這次也是臨時決定讓我做一個android採集系統的演示程式。拍照是其中一個功能,讓網搜尋了下拍照有兩

android 呼叫 系統 相機 攝像機 拍照 拍視訊

主要內容如下:系統現有相機應用的呼叫 系統現有相機拍攝照片 獲取系統現有相機拍攝的圖片 系統現有相機拍攝圖片Demo 系統現有相機拍攝視訊 系統現有相機拍攝視訊Demo 系統現有相機應用的呼叫   對於如何呼叫系統現有應用,之前就有講解,這裡簡單再說一下。在開發的應用中呼叫

android 呼叫系統相機進行拍照及照片的裁切

呼叫系統相機進行拍照是android開發中常用到的功能,例如:拍照了直接發朋友圈等。還有常用的要進行圖片的裁剪,例如:上傳自己的頭像等。你又不能拍完照直接上傳,然後在讀取截止中間的,這樣不一定是使用者想要的部分。所以,我們通常是讓使用者自己按照我們的比例,來進行裁剪。這就

呼叫系統相機拍照--是配到android-7.0

一:獲取縮放圖 直接呼叫相機拍照,無需人和許可權,但是缺點是隻能獲取到縮放圖(不清晰的哦,一般不採用這種) /** * 縮放圖 */ mThumbnail.setOnClickListene

Android demo--呼叫系統相機拍照並顯示圖片為黑白

1.環境搭建 作業系統是Mac OS,一年多以前寫Android的時候用的還是Eclipse,作業系統是Windows,記得環境很難搭建,總是會有錯誤,所以面試的時候要求完成這個Demo還是有一點點虛。不過用Baidu和Google查了怎麼搭建環境之後,發現有了官方的IDE