É uma pergunta antiga, mas ainda ativa, pois não há um recurso explícito do Android. E os caras do facebook encontraram uma solução - de alguma forma. Hoje, encontrei uma maneira que funciona para mim. Não é perfeito (veja as observações no final desta resposta), mas funciona!
A ideia principal é que eu atualize o ícone do atalho do meu aplicativo, criado pelo iniciador na tela inicial. Quando quero alterar algo no ícone de atalho, removo-o primeiro e o recrio com um novo bitmap.
Aqui está o código. Tem um botão increment
. Quando pressionado, o atalho é substituído por um que possui um novo número de contagem.
Primeiro, você precisa dessas duas permissões no seu manifesto:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Então você precisa destes dois métodos para instalar e desinstalar atalhos. O shortcutAdd
método cria um bitmap com um número nele. Isso é apenas para demonstrar que realmente muda. Você provavelmente deseja alterar essa parte com algo que deseja no seu aplicativo.
private void shortcutAdd(String name, int number) {
// Intent to be send, when shortcut is pressed by user ("launched")
Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
shortcutIntent.setAction(Constants.ACTION_PLAY);
// Create bitmap with number in it -> very default. You probably want to give it a more stylish look
Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
paint.setColor(0xFF808080); // gray
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(50);
new Canvas(bitmap).drawText(""+number, 50, 50, paint);
((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);
// Decorate the shortcut
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);
// Inform launcher to create shortcut
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
}
private void shortcutDel(String name) {
// Intent to be send, when shortcut is pressed by user ("launched")
Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
shortcutIntent.setAction(Constants.ACTION_PLAY);
// Decorate the shortcut
Intent delIntent = new Intent();
delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
// Inform launcher to remove shortcut
delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(delIntent);
}
E, finalmente, aqui estão dois ouvintes para adicionar o primeiro atalho e atualizar o atalho com um contador de incremento.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
findViewById(R.id.add).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
shortcutAdd("changeIt!", count);
}
});
findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
shortcutDel("changeIt!");
count++;
shortcutAdd("changeIt!", count);
}
});
}
Observações:
Dessa forma, também funciona se o seu aplicativo controlar mais atalhos na tela inicial, por exemplo, com diferentes extras na tela Intent
. Eles só precisam de nomes diferentes para que o correto seja desinstalado e reinstalado.
O tratamento programático de atalhos no Android é um recurso Android bem conhecido, amplamente usado, mas não oficialmente suportado. Parece funcionar no iniciador padrão e nunca tentei em nenhum outro lugar. Então, não me culpe, quando você receber este e-mail do usuário "Ele não funciona no meu telefone XYZ, com duas raizes e super explosivo"
O iniciador grava um Toast
quando um atalho foi instalado e outro quando um atalho foi desinstalado. Então, recebo dois Toast
segundos cada vez que mudo o ícone. Isso não é perfeito, mas bem, desde que o resto do meu aplicativo seja perfeito ...
Tente isso, funciona bem para mim:
1 Modifique sua
MainActivity
seçãoAndroidManifest.xml
, exclua-a, alinhe com aMAIN
categoria naintent-filter
seção2) Crie
<activity-alias>
para cada um dos seus ícones. Como isso3) Definir programaticamente: defina o atributo ENABLE para o apropriado
activity-alias
Observe que pelo menos um deve estar ativado o tempo todo.
fonte
Você não pode alterar o manifesto ou o recurso no APK assinado e selado, exceto por meio de uma atualização de software.
fonte
Programaticamente, convém publicar o iniciador de aplicativos:
Nota: este método não funciona mais a partir do Android 8.0 - Oreo
No seu AndroidManifest.xml, adicione:
Então você precisa criar sua intenção do iniciador de aplicativos:
Crie um atalho de instalação com o iniciador de aplicativos e o ícone personalizado:
E, finalmente, ative a intenção de transmissão:
fonte
Supondo que você queira alterar o ícone mostrado na tela inicial, isso pode ser feito facilmente criando um widget que faça exatamente isso. Aqui está um artigo que demonstra como isso pode ser feito para um aplicativo do tipo "novas mensagens" semelhante ao iPhone:
http://www.cnet.com/8301-19736_1-10278814-251.html
fonte
A solução da @ PA funciona parcialmente para mim. Detalhe minhas descobertas abaixo:
1) O primeiro trecho de código está incorreto, veja abaixo:
2) Deve usar o código a seguir para desativar todos os ícones antes de ativar outro, caso contrário, ele adicionará um novo ícone, em vez de substituí-lo.
MAS, se você usar o código acima, o atalho na tela inicial será removido! E não será adicionado automaticamente de volta. Você poderá adicionar programaticamente o ícone de volta, mas provavelmente não permanecerá na mesma posição de antes.
3) Observe que o ícone não será alterado imediatamente, pode levar alguns segundos. Se você clicar logo após a alteração, poderá receber um erro dizendo: "O aplicativo não está instalado".
Portanto, IMHO esta solução é adequada apenas para alterar o ícone apenas no iniciador de aplicativos, não para atalhos (ou seja, o ícone na tela inicial)
fonte
Experimente esta solução
Adicione o seguinte código quando desejar alterar o ícone do seu aplicativo
fonte
AndroidManifest.xml
exemplo:Em seguida, siga o código fornecido abaixo em
MainActivity
:fonte
com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexample
exceção. aqui eu usei o seu nome de manifesto apenas para demonstrar o meu problemaPara que a solução de Markus funcionasse, eu precisava da primeira intenção:
fonte
Aplicando as sugestões mencionadas, enfrentei a questão do aplicativo ser morto sempre que o ícone padrão é alterado para novo ícone. Então, implementamos o código com alguns ajustes. Passo 1). No arquivo AndroidManifest.xml, crie para a atividade padrão com android: enabled = "true" e outro alias com android: enabled = "false". Você não irá conter, mas anexá-las ao android: enabled = "true".
Passo 2). Crie um método que será usado para desativar o 1º alias de atividade que contém o ícone padrão e ativar o 2º alias que contém o ícone.
Etapa 3). Agora, chame esse método de acordo com sua necessidade, digamos no clique no botão ou na data específica ou na ocasião, como simplesmente -
Espero que isso ajude aqueles que enfrentam o problema do aplicativo ser morto na mudança de ícone. Happy Coding :)
fonte