Получение андроид-ресурса высокого разрешения Uri для приложения Android icon - PullRequest
0 голосов
/ 23 января 2019

Мне нужно получить 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

Первое изображение - установить с помощью setDrawable - довольно размыто
Второе изображение - установите с помощью setDrawable с DENSITY_XXXHIGH
Третье изображение - установите с помощью setImageUri - немного размыто, но я хочу, чтобы это "резче", как второе изображение выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...