Android呼叫相機的那些事

2021-08-07 15:42:38 字數 3685 閱讀 8493

呼叫相機其實很簡單,不過其實也有一些坑,現在記錄下來:

先看呼叫**:

private void tocamera() else 

//這個intent的意圖是拍照

intent intent = new intent(mediastore.action_image_capture);

if (build.version

.sdk_int >= build.version_codes.n)

//指定拍照的輸出目錄,也就是拍照完的儲存位置

intent.putextra(mediastore.extra_output, oriimageuri);

startactivityforresult(intent,camera_request_code);

}

①android7.0中嘗試傳遞 file:// uri 會觸發 fileuriexposedexception,因為在android7.0之後google認為直接使用本地的根目錄即file:// uri是不安全的操作,直接訪問會丟擲fileuriexposedexception異常崩潰.因此上面的**加了適配,增加乙個fileprovider來共享資料,直接說方案:

在manifest中新增provider:

android:name="android.support.v4.content.fileprovider"

android:exported="false"

android:granturipermissions="true">

android:name="android.support.file_provider_paths"

android:resource="@xml/provider_paths"/>

provider>

.fileprovider和provider_paths是自己命名的名字,provider_paths的實現如下:

<?xml version="1.0" encoding="utf-8"?>

xmlns:android="">

name="external_files"

path="."/>

paths>

name是uri的根目錄,path是儲存路徑的根目錄,比生成檔案的uri路徑為:

file external =environment.getexternalstoragedirectory();
那麼根據path的值,檔案儲存的根目錄是外部儲存卡的.目錄也就是根目錄。

file

file = new

file(environment.getexternalstoragedirectory()+"/mydir/", "hello.png");

你會死的很慘,因為檔案怎麼也建立不了,怎麼解決呢,那就是引入許可權管理,具體我就不貼**了。

下面說下拍照儲存後,繼續呼叫系統裁剪功能來裁剪**的過程:

private void startphotozoom() 

file file = new filestorage().createcropfile();

uri outputuri = uri.fromfile(file);//裁剪後儲存位址

intent intent = new intent("com.android.camera.action.crop");

if (build.version

.sdk_int >= build.version_codes.n)

intent.setdataandtype(oriimageuri, "image/*");

intent.putextra("crop", "true");

intent.putextra("aspectx", 1);

intent.putextra("aspecty", 1);

intent.putextra("outputx",320);

intent.putextra("outputy",320);

intent.putextra("return-data", true);

intent.putextra(mediastore.extra_output, outputuri);//和上面一樣,指定儲存裁剪後的位址

startactivityforresult(intent, crop_request_code);

}

這裡稍微說下intent的動作和資料,也是我自己的乙個理解,在**裡面intent(「com.android.camera.action.crop」);是指定intent的動作,從名字可以看出是裁剪的動作,那麼第二步也就是指定資料了,因為必須要有一些東西來進行「裁剪」的動作,資料也就是要裁剪的物件,對應

intent.setdataandtype(oriimageuri, 「image/*」),這樣相互配合,才是乙個好的「意圖「,後面又指定了裁剪後儲存的位置,現在intent已經很完美了,去處理它:

bitmap = bitmapfactory.decodestream(this.getactivity().                       getcontentresolver().openinputstream(outputuri));

profile_image.setimagebitmap(bitmap);

上面文件說過儲存的位置也可以不指定,如果不指定,該怎樣寫呢,以下是乙個例子:

private

void

startphotozoom(uri uri)

intent intent = new intent("com.android.camera.action.crop");

intent.setdataandtype(uri, "image/*");

//設定裁剪

intent.putextra("crop", "true");

//裁剪寬高比例

intent.putextra("aspectx", 1);

intent.putextra("aspecty", 1);

//裁剪的質量

intent.putextra("outputx", 320);

intent.putextra("outputy", 320);

//傳送資料

intent.putextra("return-data", true);

startactivityforresult(intent, result_request_code);

}

來看onactivityresult方法中:

public

void

onactivityresult(int requestcode, int

resultcode, intent data)

break;

}private

void

setimagetoview(intent data)

}

證明文件說的沒錯,確實可以不指定輸出的影象,而通過intent.getdata() 可以拿到,不過注意一點,一定要有intent.putextra(「return-data」, true);這句,要不然還是拿不到的,以上。

Android7 0呼叫相機

從android7.0開始,android對訪問檔案的許可權收回,所以如果我們要在應用件共享檔案,應該傳送一項content uri,並對這個uri授予臨時訪問的許可權。而對這個uri授權最簡單的方式就是使用fileprovider類。具體的操作步驟是 1.建立乙個path檔案 在res下邊建立乙個...

Android裝置儲存那些事

外部儲存 公共 共享 目錄 在之前的開發過程中,對於應用儲存目錄存在一些模糊的觀念,在androidq版本中,google對應用儲存空間又做了調整,藉此機會梳理一下。移動裝置儲存空間大致可劃分為內部儲存與外部儲存,而外部儲存又可細分為外部私有儲存與外部共享儲存,具體區別如下 儲存結構 訪問方式 獲取...

Android 7 0呼叫相機方法

android 7.0之後呼叫相機的方式不允許以file 的方式呼叫,需要以共享檔案的方式content url contentvalues contentvalues new contentvalues 1 contentvalues.put mediastore.images.media.dat...