获取用于Android应用程序的高分辨率android-resource Uri图标

时间:2019-01-23 08:26:18

标签: android imageview

我需要获取(任何给定包的)应用程序图标的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进行设置-有点模糊,但我希望这个“尖锐的东西”像上面的第二张图片

1 个答案:

答案 0 :(得分:-1)

在运行SDK <24的设备上,此方法将无法对从内容和文件方案加载的图像应用正确的密度缩放比例。在SDK> = 24的设备上运行的应用程序必须在其清单中将targetSdkVersion指定为24或更高,以便将密度缩放应用于从这些方案加载的图像。

setImageURI