我需要获取(任何给定包的)应用程序图标的android-resource
uri(格式为android.resource://[package]/[res id]
)。这被传递到另一个应用程序,以使用setImageUri
API设置ImageView。但是,正在设置的图像是低分辨率版本,我想知道如何获取高分辨率版本的Uri。
作为测试代码,我有3个ImageViews。前两个,我使用setDrawable
设置图像。第三个对同一应用程序图标使用setImageUri
。
package com.test.icontest
import android.content.Context
import android.graphics.drawable.Drawable
import android.net.Uri
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.DisplayMetrics
import android.widget.ImageView
class MainActivity : AppCompatActivity() {
companion object {
const val TEST_PACKAGE = "com.washingtonpost.rainbow"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageView = findViewById<ImageView>(R.id.iconImage)
imageView.setImageDrawable(getAppIconDrawable(applicationContext, false))
val imageView2 = findViewById<ImageView>(R.id.iconImage2)
imageView2.setImageDrawable(getAppIconDrawable(applicationContext))
val imageView3 = findViewById<ImageView>(R.id.iconImage3)
imageView3.setImageURI(getAppIconUrl(applicationContext))
}
// Returns the Uri for the android application icon
fun getAppIconUrl(context: Context): Uri {
val iconCode = context.packageManager.getApplicationInfo(TEST_PACKAGE, 0).icon
// Third image below
return Uri.Builder()
.scheme("android.resource")
.authority(TEST_PACKAGE)
.path(iconCode.toString())
.build()
}
// Returns the Drawable for the android application icon
fun getAppIconDrawable(context: Context, highRes: Boolean = true): Drawable {
val applicationInfo = context.packageManager.getApplicationInfo(TEST_PACKAGE, 0)
val res = context.packageManager.getResourcesForApplication(applicationInfo)
return if (highRes)
res.getDrawableForDensity(applicationInfo.icon, DisplayMetrics.DENSITY_XXXHIGH, null) // Second image below
else
res.getDrawable(applicationInfo.icon, null) // First image below
}
}
结果:
第一张图片-使用setDrawable
设置-有点模糊
第二张图片-使用setDrawable
和DENSITY_XXXHIGH
设置
第三张图片-使用setImageUri
进行设置-有点模糊,但我希望这个“尖锐的东西”像上面的第二张图片
答案 0 :(得分:-1)
在运行SDK <24的设备上,此方法将无法对从内容和文件方案加载的图像应用正确的密度缩放比例。在SDK> = 24的设备上运行的应用程序必须在其清单中将targetSdkVersion指定为24或更高,以便将密度缩放应用于从这些方案加载的图像。