專案中一般用于頭像更換、單圖拍攝取圖等
目錄
- 一、系統相機
- 1.1 獲取權限
- 1.2 Android6.0或者更高版本需要動態獲取權限
- 1.3 打開相機
- 1.4 Android 7.0或更高版本相機打開的時候閃退問題
- 二、獲取原圖
- 三、原圖壓縮
- 1.1 現在獲取的圖片在部分手機會出現旋轉了90°,解決辦法
- 1.2 壓縮圖片保存
- 1.3 圖片顯示
- 四、圖片上傳
一、系統相機
1.先獲取權限
2.再利用Intent 打開系統相機
1.1 獲取權限
// 拍攝照片權限
<uses-permission android:name="android.permission.CAMERA"/>
1.2 Android6.0或者更高版本需要動態獲取權限
先把所需要的的權限用陣列裝起來(需要其他權限還可以在里面添加)
private static String[] PERMISSIONS_STORAGE = {
"android.permission.CAMERA"};
public void verifyStoragePermissions(Activity activity) {
//然后通過其中的一個函式來申請
int checkSelfPermission = ActivityCompat.checkSelfPermission(activity, PERMISSIONS_STORAGE[0]);
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
// 沒有寫的權限,去申請寫的權限,會彈出對話框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
}
1.3 打開相機
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
1.4 Android 7.0或更高版本相機打開的時候閃退問題
需要打開防止記憶體泄露工具 StrictMode
private void initPhoto() {
// android 7.0系統解決拍照的問題
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
上面最好寫在onCreate()里面
二、獲取原圖
1.打開相機的時候創建絕對路徑
2.根據絕對路徑獲取URI,并把URI通過Intent存起來
3.最后根據startActivityForResult在onActivityResult中回傳中獲取原圖file
/**
* 本地絕對路徑添加檔案夾的名字
*/
private final String IMAGE_FILE_LOCATION = "image";
/**
* 圖片名字
*/
private String localFileName = "";
/**
* 圖片file
*/
private File file;
/**
*打開相機
*/
private void openCream() {
localFileName = System.currentTimeMillis() + "" + ".jpg";
//先驗證手機是否有sdcard
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {
try {
File dir = new File(Environment.getExternalStorageDirectory() + "/" + IMAGE_FILE_LOCATION);
if (!dir.exists()) {
dir.mkdirs();
}
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(dir,localFileName );
Uri uri = Uri.fromFile(file);
intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 1);
} catch (ActivityNotFoundException e) {
Toast.makeText(getActivity(), "沒有找到儲存目錄", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getActivity(), "沒有儲存卡", Toast.LENGTH_LONG).show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 1) {
file = new File(Environment.getExternalStorageDirectory()
+ "/" + IMAGE_FILE_LOCATION + "/" + localFileName);
/**
*獲取到壓縮圖(大概為300k左右)URI保存到本地并顯示在imgview中
*/
setBackground(saveBitmap(rotateBitmap(getImage(file.getPath()), readPictureDegree(file.getPath()))));
}
}
}
三、原圖壓縮
原理:重新定義好bitmap的高(Width)和寬(Hight)
/**
* 圖片按比例大小壓縮方法
*
* @param srcPath (根據路徑獲取圖片并壓縮)
* @return Bitmap
*/
public static Bitmap getImage(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
newOpts.inJustDecodeBounds = true;
// 此時回傳bm為空
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 這里設定高度為720f
float hh = 720f;
// 這里設定寬度為1024f
float ww = 1024f;
// 縮放比,由于是固定比例縮放,只用高或者寬其中一個資料進行計算即可
// be=1表示不縮放
int be = 1;
// 如果寬度大的話根據寬度固定大小縮放
if (w > h && w > ww) {
be = (int) (newOpts.outWidth / ww);
// 如果高度高的話根據寬度固定大小縮放
} else if (w < h && h > hh) {
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0) {
be = 1;
}
// 設定縮放比例
newOpts.inSampleSize = be;
// 重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
// 壓縮好比例大小后再進行質量壓縮
return compressImage(bitmap);
}
1.1 現在獲取的圖片在部分手機會出現旋轉了90°,解決辦法
1.獲取圖片的方向
2.根據獲取到的圖片方向進行矯正
/**
* 圖片正常方向
*
* @param bitmap 圖片bitmap
* @param degrees 矯正方向
* @return Bitmap
*/
public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
if (degrees == 0 || null == bitmap) {
return bitmap;
}
Matrix matrix = new Matrix();
matrix.setRotate(degrees, bitmap.getWidth() >> 1, bitmap.getHeight() >> 1);
Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmp;
}
/**
* 圖片旋轉
*
* @param path 圖片路徑
* @return int
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
default:
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
1.2 壓縮圖片保存
根據URI利用檔案流寫進去
/**
* 保存圖片
*
* @param bm 資源(這里也可以再次進行壓縮)
* @return uri
*/
private Uri saveBitmap(Bitmap bm) {
try {
FileOutputStream fos = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
return Uri.fromFile(file);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
1.3 圖片顯示
這里顯示在一個imgview中
/**
* 設定圖片背景
*
* @param uri URi
*/
private void setBackground(Uri uri) {
InputStream inputStream;
Drawable drawable = null;
try {
Log.i("圖片回呼", " uri " + uri);
inputStream = getActivity().getContentResolver().openInputStream(uri);
drawable = Drawable.createFromStream(inputStream, "dataString");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (drawable != null) {
imgview.setBackground(drawable);
imgview.setVisibility(View.VISIBLE);
Log.d("圖片回呼", "set ok");
} else {
imgview.setVisibility(View.GONE);
Log.e("圖片回呼", "setBackground error");
}
}
四、圖片上傳
根據獲取到的file,利用RequestBody
MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
if (file.exists()) {
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
builder.addFormDataPart("file", file.getName(), imageBody);
}
RequestBody requestBody = builder.build();
multipart/form-data :這個要看后臺是需要什么形式傳,圖片或許是 image/*
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/278888.html
標籤:其他
上一篇:vue創建專案程序(命令創建)
