web-dev-qa-db-fra.com

android.content.ActivityNotFoundException:

Je reçois cette exception pendant que j'essaie d'appeler une activité d'une autre. L'exception complète est 

Android.content.ActivityNotFoundException: impossible de trouver la classe d'activité explicite {com.x.y/com.x.y.class};

Je fais un intent.setClass("com.x.y","com.x.y.className")className est le nom de ma classe d'activité et com.x.y le paquet dans lequel elle réside.

Mon AndroidManifest.xml a le contenu suivant:

<activity Android:name="com.x.y.className" Android:label="@string/app_name">

Est-ce que je manque quelque chose?

21
sharath

Peut-être devez-vous vérifier que vous avez ajouté la nouvelle activité au fichier manifest.xml

Exemple:

<activity
      Android:name=".className" 
      Android:label="@string/app_name" > 
</activity>
31
Mina Samy

Si d’autres personnes rencontrent quelque chose de similaire et arrivent à ce poste, un problème que j’ai eu peut vous faire gagner du temps. Peut ne pas être lié au problème du PO mais être lié à l'exception ActivityNotFound.

J'essayais de charger une activité en utilisant:

Intent intent = new Intent( this, class );

Cependant, je continuais à obtenir la ActivityNotFoundException même si j'avais vérifié et revérifié le code plusieurs fois.

Cette exception que je recevais n'était pas réellement causée par l'intention, mais par un code que j'étais en train d'exécuter à l'intérieur de l'activité chargée en lançant une RuntimeException. (mon problème a été causé par Typeface.createFromAsset())

Il est possible que vous rencontriez une exception RuntimeException similaire dans votre activité.

Pour voir si c'est le cas, mettez votre code d'intention dans try catch blocks. Ainsi:

try {
    /* your code */
    ...
} catch ( ActivityNotFoundException e) {
    e.printStackTrace();
}

Exécutez à nouveau votre application et vérifiez dans votre LogCat. S'il s'agit du même problème, vous obtiendrez une exception RuntimeException avec une entrée "Caused By:" pointant vers votre problème réel.

J'ai passé une bonne heure à essayer de comprendre cela. Espérons que cela sauvera du temps à quelqu'un.

16
thepearson

L'activité que vous appelez doit apparaître non seulement dans le manifeste pour son propre package, mais également dans le package pour le manifeste.

14
Gangnus

Supprimez votre activité du manifeste, puis ajoutez-la à nouveau. Ce type n'écrit pas directement le XML. Au lieu de cela, allez à Application > Application nodes > add, choisissez l'activité, puis recherchez le fichier source.

Cela a fonctionné pour moi.

8
bicha

intent.setClass prend les paramètres comme "Contexte de package" et "Classe" ..__

intent.setClass(CurrentActivity.this, TargetActivity.class);

vous devez également vérifier si l'activité est enregistrée dans le fichier manifeste.

3
Andy Lin

Ajout d'une nouvelle activité et définition dans manifest.xml, mais l'erreur "Impossible de trouver une classe d'activité explicite" persiste. J'utilise Eclipse. La solution à mon problème était de "nettoyer" le projet. Dans le menu principal dans Eclipse: Projet | Nettoyer .... Ensuite, vous sélectionnez votre projet et le nettoyez.

2
M.K.

J'utilisais getActivityContext() (au lieu de Activity.this) pour le code de menu afin de sauvegarder un travail, puis de le copier-coller dans chaque activité sans le modifier à chaque fois.

Je les ai remplacés par Activity.this et le problème a disparu.

J'ai l'impression qu'un type Android plus intelligent pourrait contourner le problème sans avoir à le faire. Voudrais savoir ce que ce serait.

1
meboy

J'ai eu une ActivityNotFoundException lorsque j'ai implémenté Activity dans une autre classe (en tant que classe interne):

//... inside the utility class Pref
public static class Activity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }
}
//...

Déclaré comme suit dans le manifeste:

<activity Android:name=".Pref.Activity"
...

Après avoir déclaré cela comme une classe normale (classe publique PrefActicity) et modifié le manifeste en conséquence, cela a fonctionné normalement.

1
Carl K.

Hé, vous devez utiliser une autre forme de constructeur Intent. Cela résoudra sûrement votre problème en une seconde:

Exemple:

Intent inte=new Intent(getBaseContext(),"your class name with .class extension ");

startActivity(inte);

Cela fonctionne parfaitement et j'ai vérifié ce code, il fonctionne correctement.

1
Jalp

vous pouvez ajouter ce code dans le fichier manifiest.xml

action Android:name="com.kaushalam.activity101activity.SecondActivity"
category Android:name="Android.intent.category.DEFAULT"
0
Girish Chauhan

En plus de la réponse de Mina, lorsque vous déclarez une activité en tant que classe statique interne, vous devez écrire votre activité dans manifeste, comme ... 

         <activity Android:name=".app.FragmentLayoutSupport$DetailsActivity" />

ici .app vient du nom de votre paquet, ce peut être .helpers.afdfa $ afda

0
Yaya

J'ai eu le même cas aussi. Après avoir lu la réponse de theearson, j’ai révisé mon activité et découvert que j’avais écrit

public void onCreate(Bundle s)

Mais en fait il devrait être 

protected void onCreate(Bundle s)

Et ça marche maintenant!

0
Patrick Chan

Redémarrez Eclipse et vérifiez à nouveau votre fichier de manifeste. Si vous trouvez qu'il manque l'activité correspondante, ajoutez-la et réessayez. Cela a résolu mon problème similaire.

0
Sudhin Philip

En regardant la documentation ici ce que vous voulez, c'est:

intent.setClassName("com.x.y", "className");
0
James Greenhalgh

Essayez d'utiliser ce qui suit:

intent.setClassName("com.x.y", "com.x.y.className");

Ça marche pour moi

0
sab

Cette exception se produit également si vous incluez une bibliothèque dans votre application et si la bibliothèque appelle une activité définie dans le projet de bibliothèque. Dans ce cas, nous devons fusionner le manifeste de la bibliothèque avec le manifeste de l'application appelante. 

Avec ADT version 20, nous pouvons le faire en ajoutant l’instruction ci-dessous dans project.properties d’appel app.

manifestmerger.enabled = true  

0
Jeevan

Consultez le contenu du fichier de manifeste Android dans le dossier bin du projet. Lorsque votre application est compilée et empaquetée, le fichier manifeste est copié dans le dossier bin. Dans mon cas, le manifeste dans le dossier bin n’était pas conforme au manifeste original. C'est probablement une erreur d'Eclipse. J'ai copié manuellement le manifeste dans le dossier bin et cela a fonctionné.

0
user3491579

L'activité que vous appelez ne contient pas "sheme" et contient d'intention-filter:

<activity Android:name=".SecondActivity">
        <intent-filter>
               <action Android:name="com.example.sj.myapplication.SecondActivity"/>
               <category Android:name="Android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

donc en appelant le code:

Intent intent=new Intent("com.example.sj.myapplication.SecondActivity");
startActivity(intent);
0
Evgenii Vorobei

Cela fonctionne si vous avez un objet d'activité (que vous devez lancer):

intent.setClassName(CallingActivity.this, activityToLaunch.getComponentName().getClassName());
0
AndroidGuy

Oui, j'ai aussi ce problème. J'ai rafraîchi le projet. Et puis tout fonctionne bien.

0
mabeiyi

quand j'ai le même problème. si vous utilisez des fichiers de classe de bibliothèque et que vous l'écrivez dans des fichiers de manifeste Android, écrivez-le comme suit, puis supprimez les fichiers de manifeste de bibliothèque suivants: >> alors cela fonctionnera absolument .. 

0
user2123720

Ma solution à cette erreur a été d’ajouter un nom de package devant le nom dans le manifeste.

J'ai eu les activités suivantes: 

  • id.scanner.main.A1 

  • id.scanner.main.gallery.A2

Mon manifeste contenait ce qui suit:

<activity Android:name=".A1" ....></activity>
<activity Android:name=".A2" ....></activity>

Cela a résolu le problème:

<activity Android:name=".A1" ....></activity>
<activity Android:name="gallery.A2" ....></activity>
0
Petru