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