Wednesday 30 January 2019

Getting high resolution android-resource Uri for Android application icon

I need to get the android-resource uri (of the form android.resource://[package]/[res id]) of an application icon (of any given package). This is passed to another application to set an ImageView using the setImageUri API. However, the image being set is a low resolution version and I would like to know how to get the Uri for the high resolution version.

As a test code, I have 3 ImageViews. The first two, I am setting the image using setDrawable. The third using setImageUri for the same application icon.

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


The result:

First image - set using setDrawable - kinda blurry
Second image - set using setDrawable with DENSITY_XXXHIGH
Third image - set using setImageUri - kinda blurry, but I want this "sharper" like the second image above



from Getting high resolution android-resource Uri for Android application icon

No comments:

Post a Comment