Android点击ImageView显示Drawable图片触发ActivityNotFoundException问题
看起来你遇到的问题主要有两个核心点:Uri格式错误,以及依赖系统ACTION_VIEW可能没有合适的应用能处理你的资源Uri。我来帮你一步步解决:
问题1:Uri格式不正确
你当前写的Uri路径包含了drawable_hdpi,这是错误的——Android资源系统会自动根据设备密度选择对应的资源,不需要手动指定密度文件夹。正确的Android资源Uri格式应该是:
android.resource://[你的包名]/drawable/[图片资源名]
所以你的Uri应该修改为:
Uri uri = Uri.parse("android.resource://com.example.deepanshu.tourguideapp/drawable/voukatio");
不过更安全的写法是通过资源ID生成Uri,避免硬编码包名和资源名:
Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/" + R.drawable.voukatio);
问题2:系统可能没有应用能处理该Uri
即使修正了Uri,很多设备上可能没有默认应用支持打开Android资源Uri,这时候resolveActivity可能返回null,或者直接抛出ActivityNotFoundException。更可靠的方案是自己创建一个全屏显示图片的Activity,步骤如下:
步骤1:创建FullScreenImageActivity
首先在你的项目里新建一个Activity,比如FullScreenImageActivity,对应的布局文件activity_full_screen_image.xml只需要一个全屏的ImageView:
<?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/full_image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter" />
步骤2:修改点击事件代码
把原来的ACTION_VIEW Intent改成跳转到你自己的Activity,并传递图片的资源ID:
ImageView img = (ImageView) findViewById(R.id.image); img.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(CurrentActivity.this, FullScreenImageActivity.class); // 传递图片资源ID intent.putExtra("IMAGE_RES_ID", R.drawable.voukatio); startActivity(intent); } });
注意把CurrentActivity替换成你当前这个Activity的类名。
步骤3:在FullScreenImageActivity中加载图片
在FullScreenImageActivity的onCreate方法里,接收传递的资源ID并设置给ImageView:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_full_screen_image); // 隐藏状态栏和ActionBar(可选,实现真正的全屏) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); if (getSupportActionBar() != null) { getSupportActionBar().hide(); } ImageView fullImageView = findViewById(R.id.full_image_view); int imageResId = getIntent().getIntExtra("IMAGE_RES_ID", 0); if (imageResId != 0) { fullImageView.setImageResource(imageResId); } }
步骤4:在AndroidManifest.xml中注册Activity
别忘了在Manifest里添加这个新Activity的声明:
<activity android:name=".FullScreenImageActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
这样修改后,点击ImageView就会跳转到你自己的全屏Activity显示图片,完全避免了依赖系统应用的问题,也就不会再出现ActivityNotFoundException了。
内容的提问来源于stack exchange,提问作者Houxe

