Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.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 onActivityResult需要帮助获取图像_Java_Android_Android Intent_Android Bitmap_Onactivityresult - Fatal编程技术网

Java onActivityResult需要帮助获取图像

Java onActivityResult需要帮助获取图像,java,android,android-intent,android-bitmap,onactivityresult,Java,Android,Android Intent,Android Bitmap,Onactivityresult,我试图通过启动意图从照片库中使用startActivityForResult进行选择,并通过覆盖onActivityResult来获取图像。我不知道为什么,但当我选择一个图像并尝试在屏幕上绘制它时,什么都没有发生。我可以选择图像,就这样 我寻找答案,但没有找到任何有用的。我似乎没有多少办法来解决这个问题。我相信我已经正确地实现了每件事。这也是我第一次尝试,所以我可能是错的。调用getGalleryImage()时,我已重写了onActivityResult以获取位图并使用它设置另一个类中的位图变

我试图通过启动
意图
从照片库中使用
startActivityForResult
进行选择,并通过覆盖
onActivityResult
来获取图像。我不知道为什么,但当我选择一个图像并尝试在屏幕上绘制它时,什么都没有发生。我可以选择图像,就这样

我寻找答案,但没有找到任何有用的。我似乎没有多少办法来解决这个问题。我相信我已经正确地实现了每件事。这也是我第一次尝试,所以我可能是错的。调用
getGalleryImage()
时,我已重写了
onActivityResult
以获取位图并使用它设置另一个类中的位图变量

从我的GameView类启动意图:

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();
        }
    }
}

我想得到图像并把它画到我的屏幕上。发生的事情是我在意图打开后选择了图像,然后什么都没有。它回到了我的活动中,似乎什么都没有。你必须提供安卓7版(牛轧糖)的提供商

清单中的第一个设置提供程序

</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>
在您的onactivity结果中:

 @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();
                    }
                }
            }
        }

由于您的
视图.setSelectedImage()
似乎来自一个自定义类,因此您可能需要先尝试在
ImageView
上绘制
位图,看看它是否有效

改为使用
ImageView
并从
onActivityResult()调用
ImageView.setImageBitmap(位图)
。并确保解码后的位图不会太大,因为它可能会导致应用程序结巴,您可能想试试

另外,将
getGalleryImage()
方法更新为:

public void getGalleryImage() {
    final Intent galleryIntent = Intent(Intent.ACTION_GET_CONTENT);
    galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, 1);
}

您确定
视图
在屏幕上确实可见吗<代码>位图工厂
可以返回null。你检查过了吗?您是否已调试以检查返回的
Uri
的值,并查看它是否实际到达
try
块?是的,我的视图和所有视图似乎都正常工作,直到我选择了一个图像并且意图消失。此时,视图停止绘制,我的应用程序没有响应,但没有崩溃。这与“什么都没发生”有点不同。我不熟悉任何具有
setSelectedImage()
方法的
视图
,因此我不确定您在那里使用的是什么。我要做的第一件事是检查选中的
位图\u img
是否为空。如果没有,则图像检索工作正常,问题在于
视图
。这完全没有意义。首先,他们没有提供任何文件,也没有提供任何文件
Uri
s供外部应用程序写入。其次,您的示例甚至没有在任何地方使用
FileProvider
。您所做的只是在清单中设置一个。添加
似乎会使我的应用程序在启动时崩溃。@ChristianWaldmann我已根据androidx配置添加了提供程序。如果您没有使用androidx,请根据支持配置更改提供程序并重试。此外,您还必须在应用程序标记中添加提供程序
 @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();
                    }
                }
            }
        }
public void getGalleryImage() {
    final Intent galleryIntent = Intent(Intent.ACTION_GET_CONTENT);
    galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, 1);
}