Чтобы сохранить изображение, снятое с камеры, переопределите обратный вызов activityResult
следующим образом:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK && requestCode==CAMERA_CODE)
{
try {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
//if you want to encode the image into base64
if (imageBitmap!=null) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
String encodeImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
//You can send your image to server
} catch (Exception e) {
e.printStackTrace();
}
}
}
РЕДАКТИРОВАТЬ : если вы хотите, чтобы изображение было сохранено как файл в хранилищезатем манипулируйте им оттуда, вам придется действовать по-другому.
- Сначала вам нужно будет создать путь к файлу внутри подпапки xml папки res и путь к файлу здесь, называемый
file_paths.xml
, может быть таким:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images"
path="Android/data/YOUR_PACKAGE/files/Pictures" />
</paths>
- Затем вам нужно будет создать провайдера внутри Manifest и добавить ресурс file_path в качестве FILE_PROVIDER_PATH:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- Затем внутри вашего кода (java) вам нужно будет сгенерировать уникальный путь / имя для изображения (вы можете просто использовать следующий метод для этого):
private File createImageFile() throws IOException {
String timeStamp =
new SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(new Date());
String imageFileName = "IMG_" + timeStamp + "_";
File storageDir =
getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
imageFilePath = image.getAbsolutePath();
return image;
}
Переменная imageFilePath
здесь является членом текущего класса, потому что нам нужно, чтобы он был доступен в любом месте этого класса.
Затем можно запустить камеру, но на этот развы предоставите вывод (где данные будут сtored):
Intent picture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (picture.resolveActivity(getPackageManager()) != null) {
File photo = null;
try {
photo = createImageFile();
} catch (IOException ex) {
}
if (photo != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"YOUR_PACKAGE_NAME.provider",
photo);
picture.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(picture, CAMERA_CODE);
}
- И последнее, что нужно сделать, это прослушать результат действия и действовать соответственно:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK)
{
try {
Bundle extras = data.getExtras();
//our imageFilePath that contains the absolute path to the created file
File file = new File(imageFilePath);
Bitmap imageBitmap = MediaStore.Images.Media
.getBitmap(getContentResolver(), Uri.fromFile(file));
//do whatever else after
} catch (Exception e) {
e.printStackTrace();
}
}
}