Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将位图图像保存到手机内部存储器中_Java_Android_Cs50 - Fatal编程技术网

Java 如何将位图图像保存到手机内部存储器中

Java 如何将位图图像保存到手机内部存储器中,java,android,cs50,Java,Android,Cs50,当我在加载图像和编辑后启动应用程序时,当我单击“保存”选项时,应用程序停止工作,在Logcat中,它显示我在MediaStore中有一些错误此应用程序仅具有主活动,用于对照片应用过滤器,然后将其保存过滤后的照片为位图文件,然后在保存照片时将其转换为jpg格式。谢谢 package edu.harvard.cs50.fiftygram; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActi

当我在加载图像和编辑后启动应用程序时,当我单击“保存”选项时,应用程序停止工作,在Logcat中,它显示我在MediaStore中有一些错误此应用程序仅具有主活动,用于对照片应用过滤器,然后将其保存过滤后的照片为位图文件,然后在保存照片时将其转换为jpg格式。谢谢

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新手