FileProviderphp
想必FileProvider你們都很熟悉了,可是想了一下感受仍是寫一下比較好。java
在manifest中配置android
<application
... ...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.sdwfqin.sample.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths_public"/>
</provider>
</application>複製代碼
在 res 目錄下新建文件夾 xml 而後建立資源文件 file_paths_public(名字隨意,可是要和manifest中的名字匹配)git
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--照片-->
<external-path name="my_images" path="Pictures"/>
<!--下載-->
<paths>
<external-path name="download" path=""/>
</paths>
</paths>複製代碼
調用相機拍照github
// 全局變量
public static final int RESULT_CODE_1 = 201;
// 7.0 以上的uri
private Uri mProviderUri;
// 7.0 如下的uri
private Uri mUri;
// 圖片路徑
private String mFilepath = SDCardUtils.getSDCardPath() + "AndroidSamples";
-----------
/** * 拍照 */
private void camera() {
File file = new File(mFilepath, System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Android7.0以上URI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//經過FileProvider建立一個content類型的Uri
mProviderUri = FileProvider.getUriForFile(this, "com.sdwfqin.sample.fileprovider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mProviderUri);
//添加這一句表示對目標應用臨時受權該Uri所表明的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
mUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
}
try {
startActivityForResult(intent, RESULT_CODE_1);
} catch (ActivityNotFoundException anf) {
ToastUtils.showShort("攝像頭未準備好!");
}
}複製代碼
相冊選圖bash
// 全局變量
public static final int RESULT_CODE_2 = 202;
----------
private void selectImg() {
Intent pickIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(pickIntent, RESULT_CODE_2);
}複製代碼
onActivityResult服務器
須要注意的是拍照沒有返回數據,用以前的uri就能夠,從相冊查找圖片會返回uriapp
case RESULT_CODE_1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 調用裁剪方法
cropRawPhoto(mProviderUri);
} else {
cropRawPhoto(mUri);
}
break;
case RESULT_CODE_2:
Log.i(TAG, "onActivityResult: " + data.getData());
cropRawPhoto(data.getData());
break;複製代碼
由於用原生的一直是各類報錯,因此我這裏用的是UCrop,你們可能都見過官方的展現圖,界面可能在有些需求下顯得過於複雜,可是真正使用起來感受有不少都是能夠修改的哈哈哈!推薦你們看一下官方的例子。項目地址:github.com/Yalantis/uC…ide
簡單說一下引入方法可是並不能保證是最新的工具
依賴
compile 'com.github.yalantis:ucrop:2.2.1'複製代碼
在AndroidManifest中添加Activity
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>複製代碼
剪切圖片
public void cropRawPhoto(Uri uri) {
// 修改配置參數(我這裏只是列出了部分配置,並非所有)
UCrop.Options options = new UCrop.Options();
// 修改標題欄顏色
options.setToolbarColor(getResources().getColor(R.color.colorPrimary));
// 修改狀態欄顏色
options.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
// 隱藏底部工具
options.setHideBottomControls(true);
// 圖片格式
options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
// 設置圖片壓縮質量
options.setCompressionQuality(100);
// 是否讓用戶調整範圍(默認false),若是開啓,可能會形成剪切的圖片的長寬比不是設定的
// 若是不開啓,用戶不能拖動選框,只能縮放圖片
options.setFreeStyleCropEnabled(true);
// 設置源uri及目標uri
UCrop.of(uri, Uri.fromFile(new File(mFilepath, System.currentTimeMillis() + ".jpg")))
// 長寬比
.withAspectRatio(1, 1)
// 圖片大小
.withMaxResultSize(200, 200)
// 配置參數
.withOptions(options)
.start(this);
}複製代碼
剪切完圖片的回掉
if (resultCode == UCrop.RESULT_ERROR){
mCameraTv.setText(UCrop.getError(data) + "");
showMsg("圖片剪裁失敗");
return;
}
if (resultCode == RESULT_OK) {
switch (requestCode) {
case UCrop.REQUEST_CROP:
// 成功(返回的是文件地址)
Log.i(TAG, "onActivityResult: " + UCrop.getOutput(data));
mCameraTv.setText(UCrop.getOutput(data) + "");
// 使用Glide顯示圖片
Glide.with(this)
.load(UCrop.getOutput(data))
.crossFade()
.into(mCameraImg);
break;
}
}複製代碼
完整的onActivityResult,包含拍照的回掉
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == UCrop.RESULT_ERROR){
mCameraTv.setText(UCrop.getError(data) + "");
showMsg("圖片剪裁失敗");
return;
}
if (resultCode == RESULT_OK) {
switch (requestCode) {
case RESULT_CODE_1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
cropRawPhoto(mProviderUri);
} else {
cropRawPhoto(mUri);
}
break;
case RESULT_CODE_2:
Log.i(TAG, "onActivityResult: " + data.getData());
cropRawPhoto(data.getData());
break;
case UCrop.REQUEST_CROP:
Log.i(TAG, "onActivityResult: " + UCrop.getOutput(data));
mCameraTv.setText(UCrop.getOutput(data) + "");
Glide.with(this)
.load(UCrop.getOutput(data))
.crossFade()
.into(mCameraImg);
break;
}
}
}複製代碼
```