java如何将位图图像保存到手机内部存储器中
当我在加载图像和编辑后启动应用程序时,当我单击“保存”选项时,应用程序停止工作,在Logcat中,它显示我在MediaStore中有一些错误此应用程序仅具有主活动,用于对照片应用过滤器,然后将其保存过滤后的照片为位图文件,然后在保存照片时将其转换为jpg格式。谢谢
package edu.harvard.cs50.fiftygram;
import 安卓x.annotation.Nullable;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.core.app.ActivityCompat;
import 安卓.Manifest;
import 安卓.app.Activity;
import 安卓.content.Intent;
import 安卓.graphics.Bitmap;
import 安卓.graphics.BitmapFactory;
import 安卓.net.Uri;
import 安卓.os.Bundle;
import 安卓.os.ParcelFileDescriptor;
import 安卓.os.PersistableBundle;
import 安卓.provider.MediaStore;
import 安卓.view.View;
import 安卓.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.request.RequestOptions;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import jp.wasabeef.glide.transformations.gpu.SepiaFilterTransformation;
import jp.wasabeef.glide.transformations.gpu.SketchFilterTransformation;
import jp.wasabeef.glide.transformations.gpu.ToonFilterTransformation;
public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback {
@Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE} ,1);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] Permission, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, Permission , grantResults);
}
private ImageView imageView;
private Bitmap original;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.image_view);
}
public void apply(Transformation<Bitmap> filter) {
if (original != null) {
Glide
.with(this)
.load(original)
.apply(RequestOptions.bitmapTransform(filter))
.into(imageView);
}
}
public void applySepia(View view) {
apply(new SepiaFilterTransformation());
}
public void applyToon(View view) {
apply(new ToonFilterTransformation());
}
public void applySketch(View view) {
apply(new SketchFilterTransformation());
}
public void choosePhoto(View view) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
startActivityForResult(intent, 1);
}
public void savePhoto(View view) {
File mFile = new File("/sdcard/temp");
try {
String sav = MediaStore.Images.Media.insertImage(getContentResolver(), mFile.getPath(), "a1.jpg", "Drawing");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && data != null) {
try {
Uri uri = data.getData();
ParcelFileDescriptor parcelFileDescriptor =
getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
original = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
imageView.setImageBitmap(original);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
错误
Process: edu.harvard.cs50.fiftygram, PID: 19644
java.lang.IllegalStateException: Could not execute method for 安卓:onClick
at 安卓x.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
at 安卓.view.View.performClick(View.java:7125)
at 安卓.view.View.performClickInternal(View.java:7102)
at 安卓.view.View.access$3500(View.java:801)
at 安卓.view.View$PerformClick.run(View.java:27336)
at 安卓.os.Handler.handleCallback(Handler.java:883)
at 安卓.os.Handler.dispatchMessage(Handler.java:100)
at 安卓.os.Looper.loop(Looper.java:214)
at 安卓.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at 安卓x.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at 安卓.view.View.performClick(View.java:7125)
at 安卓.view.View.performClickInternal(View.java:7102)
at 安卓.view.View.access$3500(View.java:801)
at 安卓.view.View$PerformClick.run(View.java:27336)
at 安卓.os.Handler.handleCallback(Handler.java:883)
at 安卓.os.Handler.dispatchMessage(Handler.java:100)
at 安卓.os.Looper.loop(Looper.java:214)
at 安卓.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.IllegalArgumentException: MIME type application/octet-stream cannot be inserted into content://media/external/images/media; expected MIME type under image/*
at 安卓.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at 安卓.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at 安卓.content.ContentProviderProxy.insert(ContentProviderNative.java:481)
at 安卓.content.ContentResolver.insert(ContentResolver.java:1828)
at 安卓.provider.MediaStore.createPending(MediaStore.java:616)
at 安卓.provider.MediaStore$Images$Media.insertImage(MediaStore.java:1736)
at edu.harvard.cs50.fiftygram.MainActivity.savePhoto(MainActivity.java:85)
at java.lang.reflect.Method.invoke(Native Method)
at 安卓x.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at 安卓.view.View.performClick(View.java:7125)
at 安卓.view.View.performClickInternal(View.java:7102)
at 安卓.view.View.access$3500(View.java:801)
at 安卓.view.View$PerformClick.run(View.java:27336)
at 安卓.os.Handler.handleCallback(Handler.java:883)
at 安卓.os.Handler.dispatchMessage(Handler.java:100)
at 安卓.os.Looper.loop(Looper.java:214)
at 安卓.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:930)
# 1 楼答案
根据日志说
似乎您需要将图像保存为JPEG(图像/JPEG)或PNG或WEBP文件到特定路径中,然后通知MediaStore,如下所示
# 2 楼答案
谢谢你的帮助,我得到了答案