java - onActivityResult 需要帮助获取图像

标签 java android android-intent android-bitmap onactivityresult

我尝试通过启动 Intent 来使用 startActivityForResult 从照片库中进行选择并覆盖 onActivityResult 来获取图像。我不知道为什么,但是当我选择图像并尝试将其绘制在屏幕上时,没有任何反应。我可以选择图像,然后就是这样。

我搜索了答案,但找不到任何有帮助的内容。我似乎没有太多可以尝试解决这个问题的方法。我相信我已经正确实现了一切。这也是我第一次尝试这个,所以我可能是错的。当我调用 getGalleryImage() 时,我重写了 onActivityResult 以获取位图并使用它从另一个类设置位图变量。

从我的 GameView 类启动 Intent:

MainActivity activity = (MainActivity) context;

public void getGalleryImage() {
    Intent gallery = new Intent(Intent.ACTION_PICK);
    gallery.setType("image/*");
    String[] mimeTypes = { "image/png" };
    gallery.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
    activity.startActivityForResult(gallery, 1);
}

MainActivity 中的重写方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == MainActivity.RESULT_OK) {
            final Uri uri = data.getData();
            InputStream in;
            try {
                in = getContentResolver().openInputStream(uri);
                final Bitmap selected_img = BitmapFactory.decodeStream(in);
                view.setSelectedImage(selected_img);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                Toast.makeText(this, "An error occured!", Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(this, "You didn't pick an image!", Toast.LENGTH_LONG).show();
        }
    }
}

我想获取图像并将其绘制到我的屏幕上。发生的情况是我在 Intent 打开后选择了图像,然后什么也没有。它回到我的 Activity ,似乎根本没有任何东西在绘制。

最佳答案

您必须提供 Android 版本 7 (nougat) 的提供程序

list 中的第一个设置提供程序

</application>
    <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

  </application>

接下来在资源的 xml 文件夹内定义一个名为 filepaths 的 xml 文件路径:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_files"
        path="." />
</paths>

下一步调用 Intent 来选择图像:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
String[] mimeTypes = {"image/jpeg", "image/png"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
startActivityForResult(intent, GALLERY_REQUEST_CODE);

在您的 Activity 结果中:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Uri selectedImage = null;

        if (requestCode == GALLERY_REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    selectedImage = data.getData();
                    InputStream in;
                    try {
                        in = getContentResolver().openInputStream(uri);
                        final Bitmap selected_img = BitmapFactory.decodeStream(in);
                        yourimageview.setImageBitmap(selected_img);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "An error occured!", Toast.LENGTH_LONG).show();
                    }
                }
            }
        }

关于java - onActivityResult 需要帮助获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57667593/

相关文章:

java - 如何检查任何对象是否与具有外键约束的表中的行相关

java - Spring聚合框架: How to create nested $divide, $subtract,$mod查询?

带渐变的 Android 数字

android - 如何将数据传递给更多的 Activity

Android 在后台堆栈中的另一个 Activity 之前启动一个新 Activity,并清除旧 Activity 之上的 Activity

java - 如何向具有静态方法的类提供参数而不更改其静态限定符?

java - 在 HQL 查询中使用枚举列表作为参数

java - Android:时间戳中不显示消息创建时间

java - 代码 Socket clientSocket = new Socket();即使在单独的线程中,Android 应用也会崩溃

安卓 : startActivityForResult and OnActivityResult in getView() method