Java 如何将位图图像保存到手机内部存储器中
当我在加载图像和编辑后启动应用程序时,当我单击“保存”选项时,应用程序停止工作,在Logcat中,它显示我在MediaStore中有一些错误此应用程序仅具有主活动,用于对照片应用过滤器,然后将其保存过滤后的照片为位图文件,然后在保存照片时将其转换为jpg格式。谢谢Java 如何将位图图像保存到手机内部存储器中,java,android,cs50,Java,Android,Cs50,当我在加载图像和编辑后启动应用程序时,当我单击“保存”选项时,应用程序停止工作,在Logcat中,它显示我在MediaStore中有一些错误此应用程序仅具有主活动,用于对照片应用过滤器,然后将其保存过滤后的照片为位图文件,然后在保存照片时将其转换为jpg格式。谢谢 package edu.harvard.cs50.fiftygram; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActi
package edu.harvard.cs50.fiftygram;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.provider.MediaStore;
import android.view.View;
import android.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();
}
}
}
}
根据日志说 无法将MIME类型应用程序/八位字节流插入到内容中 似乎您需要将图像保存为JPEG(图像/JPEG)或PNG或WEBP文件到特定路径中,然后通知MediaStore,如下所示
Bitmap.compress(CompressFormat.JPEG, 100, ...);
根据日志说 无法将MIME类型应用程序/八位字节流插入到内容中 似乎您需要将图像保存为JPEG(图像/JPEG)或PNG或WEBP文件到特定路径中,然后通知MediaStore,如下所示
Bitmap.compress(CompressFormat.JPEG, 100, ...);
谢谢你的帮助,我得到了答案
public void savePhoto(View view) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
if (bitmapDrawable != null) {
modified = bitmapDrawable.getBitmap();
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Log.d("log as per ur choice ");
showMessageOKCancel("as per ur choice.");
return;
}
Log.d("as per ur choice");
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
} else
createDirectoryAndSaveFile(modified, UUID.randomUUID().toString());
} else {
Log.d("savePhoto", "bitmapDrawable is null.");
}
}
谢谢你的帮助,我得到了答案
public void savePhoto(View view) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
if (bitmapDrawable != null) {
modified = bitmapDrawable.getBitmap();
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Log.d("log as per ur choice ");
showMessageOKCancel("as per ur choice.");
return;
}
Log.d("as per ur choice");
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
} else
createDirectoryAndSaveFile(modified, UUID.randomUUID().toString());
} else {
Log.d("savePhoto", "bitmapDrawable is null.");
}
}
原因:java.lang.IllegalArgumentException:MIME类型应用程序/八位字节流无法插入到content://media/external/images/media; android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)的image/*下预期的MIME类型
原因:java.lang.IllegalArgumentException:MIME类型应用程序/八位字节流无法插入到content://media/external/images/media; android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
我应该使用什么输出流?你能详细说明你的代码吗?实际上我是java新手,我应该使用什么输出流?你能详细说明你的代码吗?实际上我是java新手