Почему не получается сохранить изображение на SD карту?
Не получается сохранить изображение на SD карту. Скажите пожалуйста, в чем проблема?
public class MainActivity extends AppCompatActivity {
ImageView imageView;
Button take_photo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
take_photo = (Button) findViewById(R.id.take_photo);
take_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String folderToSave = Environment.getExternalStorageDirectory().toString();
SavePicture(imageView,folderToSave);
}
});
}
private String SavePicture(ImageView imageView, String folderToSave)
{
OutputStream fOut = null;
Time time = new Time();
time.setToNow();
try {
File file = new File(folderToSave, Integer.toString(time.year) + Integer.toString(time.month) + Integer.toString(time.monthDay) + Integer.toString(time.hour) + Integer.toString(time.minute) + Integer.toString(time.second) +".jpg"); // создать уникальное имя для файла основываясь на дате сохранения
fOut = new FileOutputStream(file);
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // сохранять картинку в jpeg-формате с 85% сжатия.
fOut.flush();
fOut.close();
MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); // регистрация в фотоальбоме
Toast.makeText(getApplicationContext(),"Save!",Toast.LENGTH_SHORT).show();
}
catch (Exception e) // здесь необходим блок отслеживания реальных ошибок и исключений, общий Exception приведен в качестве примера
{
return e.getMessage();
}
return "";
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="300dp"
android:layout_height="180dp"
android:src="@drawable/dummyphoto"/>
<Button
android:id="@+id/take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Take Photo"
android:background="@color/colorAccent"
android:textColor="#fff"
android:textSize="22sp"
android:textAllCaps="false"
android:layout_margin="15dp"
android:padding="8dp"/>
</LinearLayout>```
`<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>` - тоже поключил
Ответы (2 шт):
Автор решения: Maks
→ Ссылка
Попробуйте этот код для сохранения изображения(iv=imageview):
BitmapDrawable draw =
(BitmapDrawable) iv.getDrawable();
Bitmap bitmap = draw.getBitmap();
FileOutputStream outStream = null;
File sdCard =
Environment.getExternalStorageDirectory();
File dir = new
File(sdCard.getAbsolutePath() + "/YourFolderName");
dir.mkdirs();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
File outFile = new File(dir, fileName);
outStream = new FileOutputStream(outFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
И добавьте это в манифест:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Автор решения: Freedom
→ Ссылка
На кнопку повешаем сохранение:
public void saveImage (View v) { //saveImage укажите в атрибуте onClick кнопки
showDialogForSave();
}
//проверяем есть ли разрешение на сохранение изображения, если нет, то спрашиваем у //пользователя
private void showDialogForSave() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST);
}else {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getString(R.string.ColorfulDialog)); builder.setNegativeButton(getResources().getString(R.string.ColorfulDialogNegative), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setPositiveButton(getResources().getString(R.string.ColorfulDialogPositive), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
save();
} catch (IOException e) {
e.printStackTrace();
}
dialog.dismiss();
}
});
builder.show();
}
}
//результат запроса разрешений
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST && grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED){
try {
save();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//сохранеям изображение
private void save() throws IOException{
Bitmap bitmap = paintView.getBitmap();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String datetime = sdf.format(new Date());
String file_name = "MyPicture_" +datetime+ ".png";
OutputStream outputStream;
boolean saved;
File folder;
//проверяем если у пользователя версия андроид 10+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
folder = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES)
+ File.separator + "Coloring for kids");
} else {
folder = newFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ File.separator + "Coloring for kids");
}
if (!folder.exists())
folder.mkdirs();
File subFolder = new File(folder, Common.ITEM_SELECTED);
if (!subFolder.exists())
subFolder.mkdirs();
File image = new File(subFolder+File.separator+file_name);
Uri imageUri = Uri.fromFile(image);
outputStream = new FileOutputStream(image);
saved = bitmap.compress(Bitmap.CompressFormat.PNG,100, outputStream);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentResolver resolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME,file_name);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,
Environment.DIRECTORY_PICTURES+File.separator+getString(R.string.app_name));
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
outputStream = resolver.openOutputStream(uri);
saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
}else{
sendPictureToGallery(imageUri);
}
if(saved) Toast.makeText(Colorful.this,getResources().getText(R.string.savePictureToGallery), Toast.LENGTH_SHORT).show();
else
Toast.makeText(Colorful.this,getResources().getString(R.string.failedToSave), Toast.LENGTH_SHORT).show();
outputStream.flush();
outputStream.close();
finish();
}
private void sendPictureToGallery(Uri imageUri) {
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(imageUri);
sendBroadcast(intent);
}
И в манифесте не забудьте указать разрешения на запись