Android: java.lang.SecurityException: Negação de permissão: iniciar intent

112

Eu criei um aplicativo que contém a atividade GWVectraNotifier que é chamado de outros aplicativos para exibir Notificação.

Na caixa de diálogo de notificação, haverá o botão 'mostrar' e o botão 'fechar'.

Ao clicar no botão 'mostrar', a atividade correspondente será iniciada.

Para verificar a funcionalidade do aplicativo acima,

Iniciei a atividade GWVectraNotifier do aplicativo K9Mail no gatilho do evento checkmail.

Consigo iniciar a atividade GWVectraNotifier com sucesso, mas ao clicar no botão 'mostrar', terei que iniciar a atividade 'MessageList' do K9mail. Para isso, escrevi o código abaixo:

Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i); 

que lança:

WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675):     at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675):     at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2$1.run(GWVectraNotifier.java:63)
WARN/System.err(675):     at android.app.Activity.runOnUiThread(Activity.java:3707)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2.onClick(GWVectraNotifier.java:53)
WARN/System.err(675):     at android.view.View.performClick(View.java:2408)
WARN/System.err(675):     at android.view.View$PerformClick.run(View.java:8816)
WARN/System.err(675):     at android.os.Handler.handleCallback(Handler.java:587)
WARN/System.err(675):     at android.os.Handler.dispatchMessage(Handler.java:92)
WARN/System.err(675):     at android.os.Looper.loop(Looper.java:123)
WARN/System.err(675):     at android.app.ActivityThread.main(ActivityThread.java:4627)
WARN/System.err(675):     at java.lang.reflect.Method.invokeNative(Native Method)
WARN/System.err(675):     at java.lang.reflect.Method.invoke(Method.java:521)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
WARN/System.err(675):     at dalvik.system.NativeStart.main(Native Method)

Na verdade, não consigo entender quais permissões incluir no arquivo de manifesto do meu aplicativo Notifier para acessar MessageList de k9Mail. Estou colando abaixo as permissões incluídas no arquivo de manifesto do aplicativo k9mail:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"/>
<permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="dangerous"
            android:label="@string/read_attachment_label"
            android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"/>
<permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"
             android:permissionGroup="android.permission-group.MESSAGES"
             android:protectionLevel="dangerous"
             android:label="@string/remote_control_label"
             android:description="@string/remote_control_desc"/>
<uses-permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"/>
<permission android:name="com.fsck.k9.permission.READ_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/read_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"/>
<permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/delete_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"/>           

Alguém pode me dizer qual permissão incluir no meu aplicativo? Nas permissões acima, algumas são apenas para k9mail, porque essas são as classes de permissão escritas para k9. Portanto, só poderei incluir as permissões integradas do Android nas permissões fornecidas acima. Também tentei fazer isso, mas não resolveu meu problema :(

Swathi EP
fonte
Resolvi isso adicionando o seguinte filtro de intent ao arquivo de manifesto sob a tag MessageList Activity em AndroidManifest.xml: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP
adicionei <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> e android: export = "true", mas ainda estou recebendo java.lang.security exceção? você pode me ajudar a resolver isso ..
Charan Pai

Respostas:

155

Você tem que adicionar android:exported="true" o arquivo de manifesto na atividade que está tentando iniciar.

Do android: documentação exportada :

android: exportado
Se a atividade pode ou não ser iniciada por componentes de outros aplicativos - "verdadeiro" se pode ser, e "falso" se não. Se "false", a atividade pode ser iniciada apenas por componentes do mesmo aplicativo ou aplicativos com o mesmo ID de usuário.

O valor padrão depende se a atividade contém filtros de intent. A ausência de quaisquer filtros significa que a atividade pode ser chamada apenas especificando seu nome de classe exato. Isso implica que a atividade é destinada apenas para uso interno do aplicativo (já que outros não saberiam o nome da classe). Portanto, neste caso, o valor padrão é "false". Por outro lado, a presença de pelo menos um filtro implica que a atividade se destina a uso externo, portanto, o valor padrão é "verdadeiro".

Este atributo não é a única maneira de limitar a exposição de uma atividade a outros aplicativos. Você também pode usar uma permissão para limitar as entidades externas que podem invocar a atividade (consulte o atributo permission).

Prateek Thakur
fonte
2
Corrija metade do problema para mim, se você tentar instalar o aplicativo com o serviço exportado primeiro e, em seguida, instalar o aplicativo principal, você nunca conseguirá remover o serviço ... a outra maneira funciona bem, no entanto ... Isso ocorre porque a permissão necessária não está presente ao instalar o aplicativo principal, mas não sei como resolver isso sem remover as permissões ...
Bibu
102

o java.lang.SecurityException você está vendo é porque você pode inserir duas entradas apontando para a mesma atividade. Remova o segundo e você estará pronto para ir.

Mais Explicação

Você pode ser declarado a atividade 2 vezes no manifesto com propriedades diferentes, como:

 <activity android:name=".myclass"> </activity>

e

 <activity android:name=".myclass" android:label="@string/app_name"> 
     <intent-filter> 
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

Você deve remover o indesejado do manifesto

Jomia
fonte
2
você pode ser declarado a atividade 2 vezes no manifesto com propriedades diferentes, como: <activity android: name = ". myclass"> </activity> e <activity android: name = ". myclass" android: label = "@ string / app_name "> <intent-filter> <action android: name =" android.intent.action.MAIN "/> <category android: name =" android.intent.category.LAUNCHER "/> </intent-filter> < / atividade>. você deve remover o indesejado do manifesto
Jomia
1
Ótima resposta jomia.Mas uma pergunta, por vez eu tenho apenas uma atividade de iniciador. E o mesmo código executado com eumlaotr, mas no dispositivo mostra exceção de segurança. Você pode explicar, por favor.
Tofeeq Ahmad
Acho que você tem que desinstalar o aplicativo no dispositivo e reinstalá-lo novamente. Então vai funcionar
Jomia
16

Em seu arquivo de manifesto, escreva isso antes </application >

<activity android:name="com.fsck.k9.activity.MessageList">
   <intent-filter>
      <action android:name="android.intent.action.MAIN">
      </action>
   </intent-filter>
</activity>

e me diga se isso resolve seu problema :)

Muhammad Shahab
fonte
bem, olhando os logs, eu tinha certeza de que ajudaria. Faça uma coisa, cole seu arquivo de manifesto completo aqui
Muhammad Shahab
<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <uses-permission android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android: name = "android.permission.READ_CONTACTS" /> <uses-permission android: name = "android.permission.READ_SYNC_SETTINGS" /> <uses-permission android: name = "android.permission.READ_OWNER_DATA" /> <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP
<uses-permission android: name = "android.permission.INTERNET" /> <uses-permission android: name = "android.permission.VIBRATE" /> <uses-permission android: name = "android.permission.WAKE_LOCK" / > <uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <application android: icon = "@ drawable / icon" android: label = "@ string / app_name" android: theme = "@ android: style / Theme.NoTitleBar "> <activity android: name =". GWVectraNotifier "android: label =" @ string / app_name "android: theme =" @ android: style / Theme.Dialog ">
Swathi EP
<intent-filter> <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> < / application> </manifest>
Swathi EP de
Nos 3 comentários acima, colei meu arquivo de manifesto do aplicativo Notifier. Obrigado pela sua resposta.
Swathi EP de
7

Eu tive esse problema com essa atividade exata.

Você não pode iniciar com.fsck.k9.activity.MessageList a partir de uma atividade externa.

Resolvi com:

Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9"); this.startActivity(LaunchK9);

Usando http://developer.android.com/reference/android/content/pm/PackageManager.html

user1305537
fonte
6

Eu estava tendo o mesmo problema e queria evitar adicionar o filtro de intent que você descreveu. Depois de pesquisar um pouco, encontrei um atributo xml android: export que você deve adicionar à atividade que gostaria de ser chamada.

Por padrão, é definido como falso se nenhum filtro de intent for adicionado à sua atividade, mas se você tiver um filtro de intent, ele será definido como verdadeiro.

aqui é a documentação http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: adicione android:exported="true"à sua atividade no arquivo AndroidManifest.xml e evite adicionar o filtro de intenção :)

Jason
fonte
1

Certifique-se de que o componente tenha o sinalizador "exportado" definido como verdadeiro. Além disso, o componente que define a permissão deve ser instalado antes do componente que o usa.

Naren
fonte
Além disso, você deve ter certeza de que seu aplicativo está na partição de sistema / aplicativo privado para desfrutar do luxo do nível de sistema. Isso é necessário em dispositivos KitKat em diante
Naren
1

É fácil talvez você tenha erro na configuração.

Por exemplo: Manifest.xml

insira a descrição da imagem aqui

Mas na minha configuração tenho por padrão Activity .Splash

insira a descrição da imagem aqui

você precisa verificar esta configuração e o arquivo Manifest.xml

Boa sorte

David Hackro
fonte
1

target sdkResolvi esta exceção mudando a versão do kitkat 19 em dianteAndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
Steve
fonte
A propósito, no momento o Gradle cuida disso, e os desenvolvedores Android não especificam a versão sdk no arquivo de manifesto
kiedysktos
1
Existe uma solução terrível. Nunca mire para baixo.
Jared Burrows
Isso funcionará, mas há uma grande chance de causar mais problemas do que resolver. Essa é a minha opinião
Evren Ozturk
0

Meu problema era que eu tinha isso: errado Em vez disso: corrigir

Uriel Frankel
fonte