Мне нужно получить android-resource
uri (в форме android.resource://[package]/[res id]
) иконки приложения (любого данного пакета). Это передается другому приложению для установки ImageView с использованием setImageUri
API. Однако устанавливаемое изображение является версией с низким разрешением, и я хотел бы знать, как получить 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
}
}
Результат:
![image](https://i.stack.imgur.com/c96yw.png)
Первое изображение - установить с помощью setDrawable
- довольно размыто
Второе изображение - установите с помощью setDrawable
с DENSITY_XXXHIGH
Третье изображение - установите с помощью setImageUri
- немного размыто, но я хочу, чтобы это "резче", как второе изображение выше