呼叫相機其實很簡單,不過其實也有一些坑,現在記錄下來:
先看呼叫**:
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...