android开发,调用摄像头拍照,并按照当前日期时间保存图片。
无损保存原图
package com.lotaai.showcase.activity;
import com.lotaai.showcase.R;
import com.lotaai.showcase.comm.ResourceConfig;
import com.lotaai.showcase.comm.WebSettingConfig;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
public class PhotoWallActivity extends SlideBackActivity {
private WebView pageWebView;
private ImageView goodsImageView;
private File saveFilePath = null;
private String filePath = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo_wall);
// Android6.0之后的系统就需要动态申请内存卡的读写权限
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 10001);
goodsImageView = findViewById(R.id.preview);
}
/**
* 拍照点击事件
* @param view
*/
public void takePhoto(View view){
if(saveFilePath!=null){
String imageName = getTimeFormat();
filePath = saveFilePath.getPath() + "/" + imageName;
String absolutePath = (new File(filePath)).getAbsolutePath();
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.N){
takePhotoBiggerThan7(absolutePath);
}else {
// 指定拍照意图
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 加载路径图片路径
Uri mUri = Uri.fromFile(new File(filePath));
// 指定存储路径,这样就可以保存原图了
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
startActivityForResult(openCameraIntent, 1);
}
}else{
Toast.makeText(this,"你拒绝了权限,无法创建文件!",Toast.LENGTH_LONG).show();
}
}
/**
* android系统大于7后的处理
*/
private void takePhotoBiggerThan7(String absolutePath) {
Uri mCameraTempUri;
try {
ContentValues values = new ContentValues(1);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
values.put(MediaStore.Images.Media.DATA, absolutePath);
mCameraTempUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if (mCameraTempUri != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraTempUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
}
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 拍照后的回调事件
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
Toast.makeText(PhotoWallActivity.this, "sd卡不可用", Toast.LENGTH_SHORT).show();
return;
}
// String fileName = "Goods" + ".jpg";
// Toast.makeText(PhotoWallActivity.this, "照片名称:" + fileName, Toast.LENGTH_SHORT).show();
// Bundle bundle = data.getExtras();
// Bitmap mBitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式
//
// File filePath = new File(saveFilePath, fileName);
//
// FileOutputStream fileOutputStream = null;
try {
FileInputStream is = new FileInputStream(filePath);
// 把流解析成bitmap,此时就得到了清晰的原图
Bitmap bitmap = BitmapFactory.decodeStream(is);
// fileOutputStream = new FileOutputStream(filePath);
// mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
goodsImageView.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 获得文件读写授权的回调事件
* 授权成功后创建文件夹
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length == 0 || PackageManager.PERMISSION_GRANTED != grantResults[0]) {
Toast.makeText(this,"你拒绝了权限,无法创建文件!",Toast.LENGTH_LONG).show();
} else {
//在这执行你创建文件的代码
saveFilePath = null;
String today = getDateFormat();
// 在本地根目录创建文件夹
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {
String main = Environment.getExternalStorageDirectory().getPath() + File.separator + "/showcase/photo_wall/" + today + "/";
saveFilePath = new File(main);
if (!saveFilePath.exists()) {
saveFilePath.mkdirs();//在根创建了文件夹folder
}
}
}
}
// 获取日期
public String getDateFormat(){
//获取系统的日期
Calendar calendar = Calendar.getInstance();
//年
int year = calendar.get(Calendar.YEAR);
//月
int month = calendar.get(Calendar.MONTH)+1;
//日
int day = calendar.get(Calendar.DAY_OF_MONTH);
return year + "-" + month + "-" + day;
}
// 获取时间命名的文件名
public String getTimeFormat(){
//获取系统的日期
Calendar calendar = Calendar.getInstance();
//小时
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//分钟
int minute = calendar.get(Calendar.MINUTE);
//秒
int second = calendar.get(Calendar.SECOND);
long timeStamp = calendar.getTimeInMillis();
return hour + "_" + minute + "_" + second + "_+++_" + timeStamp + ".jpg";
}
}
XML布局
<Button
android:onClick="takePhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照"/>
<ImageView
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
android:maxHeight="600dp"
/>