studio - runtime exception android
Android: no se puede instanciar la actividad/ClassNotFoundException (30)
¿Estás seguro de que el nombre de tu paquete es único? No sé qué pasará si el usuario tiene otra aplicación que usa el mismo nombre de paquete, pero puede causar errores extraños como este.
EDITAR: Acabo de ver esta página , me recuerda que ya tenía este problema al descargar una aplicación del mercado de Android. La aplicación se bloqueó al inicio, probé muchas veces, pero siempre terminé con el mismo resultado. Luego traté de desinstalar la aplicación, reinstalarla y todo funcionó bien. Todavía lo estoy usando hoy y el problema nunca volvió a pasar.
En mi enlace, también puede ver que reprodujeron su error al hacer que la aplicación sea inalcanzable (desmontar SD), por lo que definitivamente no es un problema con su código.
Recientemente publiqué una aplicación en el mercado y ahora recibo un error de parte de un usuario, la aplicación presumiblemente se bloquea justo cuando comienza. Lamentablemente, no puedo contactarlo directamente y la aplicación funciona bien tanto en el emulador como en mi teléfono (y los teléfonos de algunos amigos).
EDITAR: Supongo que esto le sucede a más de un usuario, ya que recibí comentarios en el mercado como "cuelga al inicio" o "no funciona". Solo recibí esta stacktrace pero no hay información sobre la configuración, el dispositivo, la versión de Android, etc.
La aplicación es una simple caja de resonancia, por lo que realmente no hay magia involucrada, pero no puedo entender por qué falla en algunos teléfonos. Aquí está el rastro de la pila que estoy obteniendo, espero que alguien me pueda ayudar:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.SoundMachine}: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
... 11 more
Estas son las primeras líneas de mi actividad:
public class SoundMachine extends Activity {
private SoundManager mSoundManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EDITAR: Este es (casi) completo en Crear:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSoundManager = new SoundManager();
mSoundManager.initSounds(getBaseContext());
int counter = 0;
for (Integer soundFile : soundFiles) {
counter++;
mSoundManager.addSound(counter, soundFile);
}
ImageButton SoundButton1 = (ImageButton) findViewById(R.id.sound1);
SoundButton1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mSoundManager.playSound(1);
}
});
SoundButton1.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
saveSoundChoice(soundFiles[0], soundNames[0]);
return true;
}
});
(...more of this...)
Button StopButton = (Button) findViewById(R.id.stopbutton);
StopButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mSoundManager.stopAll();
}
});
}
Y aquí está mi manifiesto:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app" android:installLocation="preferExternal"
android:versionCode="9" android:versionName="1.2">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SoundMachine" android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
</manifest>
Entonces, todos los errores posibles que ya leí aquí y en algunos foros no se aplican a mi aplicación.
- La actividad está presente en el manifiesto.
- El supermétodo se llama en el método modificado.
- ContentView se establece antes de acceder a los elementos en la vista.
Sé que es difícil determinar el origen de un error sin poder reproducirlo, pero tal vez alguien tenga una idea brillante y pueda ayudarme.
Algunas preguntas:
-
¿Necesito la parte "intencionada" en el manifiesto?Eclipse lo creó cuando creé el proyecto.(Sí, según Mayra) -
¿Debería llamarse el supermétodo a dónde está?(Sí, según Mayra)
EDITAR: La pregunta principal que queda ahora es: ¿Cómo es que la ruta en PathClassLoader es diferente de mi nombre de paquete? La página que John J Smith publicó parece tratar el mismo problema, pero no entiendo la corrección que se aplicó allí.
Gracias, Select0r
¿Has cambiado el nombre del paquete en cualquier momento? Esto normalmente sucede si el paquete fue renombrado después de la creación. El siguiente enlace debería ser útil en ese caso http://code.google.com/p/android/issues/detail?id=2824 . Si este no es el caso, publique su archivo de manifiesto completo.
Acabo de recibir el mismo error (No se puede crear una instancia de actividad ...) con Opera Mini. Opera Mini estaba en la tarjeta SD (se movió a la tarjeta SD en la configuración de la aplicación). El error parece estar relacionado con el hecho de que cambié la tarjeta SD ayer. El dispositivo se apagó, copié todos los datos de la tarjeta anterior en la nueva tarjeta (con cp -a) y luego inserté la nueva tarjeta y reinicié el dispositivo. Todo parece funcionar como se esperaba, pero ahora veo que todas las aplicaciones en la tarjeta SD se bloquean con el mismo error.
- Dispositivo: HTC Desire HD (Android 2.2)
- Tarjeta SDHC antigua: SanDisk 8GB clase 4
- Nueva tarjeta SDHC: Kingston 16GB clase 4
Entonces, diría que es un error de Android y no algo que los desarrolladores de aplicaciones puedan solucionar.
También vea: http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html
Siempre ha sido el caso que cuando intercambia tarjetas SD en un dispositivo Android, si copia físicamente los contenidos de la tarjeta anterior a la nueva, el sistema utilizará los datos en la nueva tarjeta como si nada hubiera cambiado. Esto también es cierto para las aplicaciones que se han instalado en la tarjeta SD ".
Esto parece ser incorrecto
Al igual que Bobf Cali, primero vi este error después de cambiar el nombre de mi paquete base para cambiar la sección "ejemplo". Para solucionarlo, tuve que eliminar mis directorios gen y bin , limpiar el proyecto y reconstruir.
Tenga en cuenta que dependiendo de la versión del plugin de eclipse Android que esté utilizando (si corresponde), también puede tener que actualizar los nombres de actividad en su AndroidManifest.xml
Asegúrese de que su directorio / src esté listado en sus proyectos> propiedades> ruta de compilación java> fuente
Borre los archivos de la carpeta BIN y GEN. Reconstruir, todo debería funcionar. Comprueba si hay otro error debajo de "no se puede crear una instancia", a veces otro error es activar esto (la actividad no se puede cargar debido a algo, incluso si se ha encontrado su clase.
Desde la actualización de ADT a la revisión 22 (mayo de 2013) debe marcar la casilla de verificación "Librerías privadas de Android" en Proyecto -> Propiedades -> Ruta de compilación de Java -> Ordenar y exportar en Eclipse para que sus proyectos anteriores eliminen esta excepción. .
Echa un vistazo a este artículo: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/ que explica las limitaciones de almacenamiento de aplicaciones en tarjetas SD. Si sus usuarios tienen su tarjeta SD montada en una computadora, eso podría hacer que la clase SoundMachine sea invisible. Y me pregunto si el comando cp falla (el intento de Perja de corregirlo) porque podría cambiar la propiedad de los archivos de modo que el ID de usuario de la aplicación y la propiedad de los archivos ya no coincidan.
Este error también puede ocurrir cuando (a nivel de proyecto) importa incorrectamente> Android> código de Android existente en el espacio de trabajo, a través de Eclipse. En mi caso, esto resultó en una carpeta vacía "src", pero luego noté una nueva carpeta comenzando con "java" en la raíz y continuando con la ruta del paquete (es decir, com / zyzcorp / ...), lo que lleva a MainActivity. archivo java
Para probar lo que pensé que podría solucionar el problema, copié el archivo com. *. MainActivity.java en la carpeta src, actualicé, limpié y reinicié Eclipse. Pude construir y ejecutar la aplicación en el dispositivo de destino.
Este problema puede existir cuando cambia el nombre de su clase y actualiza el archivo de manifiesto y el archivo de manifiesto no se actualiza en el emulador. Intente desinstalar la aplicación del emulador y luego vuelva a instalarla. Esto funcionará
Este problema también puede ocurrir si tiene un constructor con uno o más parámetros en su clase de actividad.
Esto me sucedió cuando reformulé uno de los nombres de mi paquete y la herramienta de refactor eliminó el "." Principal. de todos mis nombres de actividad. entonces en AndroidManifest.xml, tuve que cambiar android: name = "MyActivity" a android: name = ". MyActivity"
Espero que esto ayude a alguien, solo perdí un montón de tiempo
Esto no se aplica a la pregunta de la OP, pero sí a la mía y me llevó bastante tiempo descifrarlo: al usar la API de Google Maps, asegúrese de haber incluido la declaración de la biblioteca en el manifiesto de la aplicación.
Por ejemplo:
public class MyActivity extends MapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
En AndroidManifest.xml
:
<application>
<uses-library android:name="com.google.android.maps" />
<activity android:name="MyActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Lo que tenía que hacer era simplemente volver a hacer el proceso de construcción / exportación sin ninguna modificación en el código. Me funcionó, y lo hice para exportarlo dos veces. En mi primera exportación, la compilación APK tiene un tamaño de archivo más bajo y la segunda exportación (sin ninguna modificación al código / configuración) produjo un tamaño de archivo ligeramente mayor (aproximadamente 200 KB de diferencia).
Este error en la construcción es realmente costoso, te mata frente a tu administrador y debe ser realmente reparado por el equipo de Android / Eclipse. Un poco de mierda
Me encontré con este problema cuando estaba incluyendo proyectos de Java en mi buildpath para mi proyecto de Android orientado a JavaSE-1.7.
Por alguna razón, mi emulador no arrojaría una clase que no se encontrara si el proyecto java que estaba incluyendo se creó originalmente apuntando a JavaSE-1.6. Eclipse me da una advertencia: "Build path especifica el entorno de ejecución JavaSE-1.6. No hay JRE instalados en el espacio de trabajo que sean estrictamente compatibles con este entorno". Pero el emulador de Android se lanzaría y no obtendría una classnotfoundexception
Por lo tanto, si incluye proyectos que se dirigen a JavaSE-1.7, vuelva a hacerlos dirigidos a JavaSE-1.6 y esto puede resolver su problema.
¡Buena suerte!
Mire el paquete definido en la parte superior del archivo manifiest y asegúrese de que coincida con el paquete donde está definida su clase.
Mi problema era que no tenía nombres de paquetes coincidentes.
También insinúa que tiene una carpeta llamada "libs" con una "s". Coloque todos los archivos jar que agregó dentro y agregue a la ruta de compilación.
No sé por qué la ruta en el PathClassLoader es diferente a su nombre de paquete, pero cuando prueba en el emulador intente forzar un cierre y luego ejecutarlo de nuevo, según este link
No veo nada obviamente mal. Todo lo que puedo decir es intentar probarlo en tantas configuraciones diferentes como sea posible.
Pruébelo en el emulador para cada nivel de SDK posible, siga las pautas para probar en pantallas de diferentes tamaños (aunque ese no parece ser su problema).
Intente probarlo en un teléfono de cada uno de los principales proveedores, si puede encontrar amigos que los tengan: HTC Sense, Motoblur, etc.
Si solo obtienes un informe, podría ser algo complicado con el dispositivo de ese tipo. Vea si obtiene otros informes similares que agregan más datos.
Recientemente compré una tableta nueva para desarrollo solo con Android 4.0. No tenía una tarjeta SD externa. El programa de demostración que estaba ejecutando se bloqueará con el mismo error. Tenía la misma línea en el manifiesto que solicita permiso SD:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Después de instalar una tarjeta SD externa, el problema desapareció. Es posible que la persona no tenga una tarjeta SD y su software no la esté manejando correctamente. Mi programa de demostración no verifica la existencia de una tarjeta SD. Aquí hay un enlace de stackflow que describe el problema:
Desarrollo de Android: prueba para la tarjeta SD o asume que está ahí.
Me doy cuenta de que llego tarde a la fiesta, pero esto puede ayudar a otra persona.
Resolví este problema seleccionando: Proyecto-> propiedades-> orden y exportación
selecciona todos los archivos jar externos. limpiar y construir solucionó el problema
Resolví esto y pude localizar las causas: -El Manifiesto será corrupto. Incluso si la estructura del paquete es correcta y cada uno de los datos se anotó correctamente, no se encontrará la actividad. -R estará en la estructura del paquete que primero se declaró antes de cambiar el nombre. -Las configuraciones de ejecución se configuran con el paquete incorrecto de R. Por lo tanto, no se puede encontrar la actividad.
Lo que hemos intentado: -Manualmente editando las configuraciones de ejecución a través de export / import -Manualmente cambiando el nombre de la estructura del paquete-Renombrando manualmente la estructura del paquete-R -Deleting the run-config (se reconstruirá si intentas iniciar la aplicación )
Solución: intente configurar un nuevo proyecto sin reutilizar su manifiesto. Intenté reutilizarlo y volví a tener los mismos problemas. Entonces, después de la causa principal tiene que ser el manifiesto corrupto. ¡Espero que esto ayude!
Solo estaba teniendo un problema con esto yo mismo, así que quiero mencionar lo que me causó el problema. Acabo de incluir algunas nuevas bibliotecas configurando APK de expansión. Las bibliotecas son dependientes entre sí y solo incluía una de ellas en mis propiedades> android> bibliotecas.
Entonces, esto podría suceder si el usuario no tiene una biblioteca en su teléfono que tenga la mayoría de los usuarios.
Mostraba ClassNotFoundException
en mi actividad principal porque implementa una clase que estaba en la biblioteca faltante.
Soluciono este problema eliminando la carpeta "bin" y "gen" y reconstruyendo el proyecto.
Tal vez sea demasiado tarde para resolver su problema, pero con suerte lo ayudará a otra persona.
Tuve un problema similar y después de muchos intentos, decidí eliminar R.java.
Eso hizo el truco.
Tenía 5 paquetes diferentes. Y, por alguna razón, el compilador buscaba la actividad en el paquete incorrecto.
Así que cambié mi actividad y toda la clase que hereda la actividad al paquete que estaba buscando.
Obtuve el nombre del paquete que estaba buscando al principio del logcat.
Tengo el mismo problema, pero esto lo solucionó. En mi androidmanifest.xml tuve esta línea llamada android: name = myappnameActivity. Aunque mi nombre de clase era simplemente myappname. Por lo tanto, quité la parte Activity en el archivo xml y todo estaba bien.
Tuve el mismo problema contigo y, después de horas de búsqueda, descubrí algo interesante. Trataré de exponer eso lo más claramente posible:
- Creé un proyecto con un paquete llamado "myapp.sound" que contiene la actividad. El programa funciona normalmente;
- Cambié el nombre de ese paquete llamándolo "app.soundapp" y el programa todavía funcionaba normalmente.
Sin embargo, en el archivo manifest.xml del programa había algo extraño: el nombre del paquete era el antiguo "myapp.sound". Cambié el manifiesto con el nombre nuevo correcto y, desde ese momento, nuestro error ocurrió. No sé por qué, pero parece que el "cambiador de nombre de paquete" de Eclipse no actualiza todas las dependencias. Si no es estrictamente necesario, no cambie el nombre del paquete que contiene la actividad. Tal vez, para resolver su problema, tenga que crear un nuevo proyecto y copiar dentro de él toda su clase java.
Tuve el mismo problema en un proyecto reciente de Android. El problema resultó ser bastante simple, pero fue difícil de localizar. Esto me sucedió a mí luego refactoré el nombre del paquete de la actividad del punto de entrada de la aplicación. Esto creó un conflicto con el archivo gen /.../ R.java, ya que el paquete no se refactivó. Eclipse no se quejó, pero en el tiempo de ejecución recibí el mismo error que publicó: no se pudo crear una instancia ... classNotFoundException ...
Lección aprendida de esto: NO refactorice el nombre del paquete que contiene su actividad principal.
Espero que esto te ayude a ti o a cualquiera que se rompa la cabeza por este error.
Tuve el mismo problema que lo resolví desmarcando las Dependencias de Android del Proyecto -> Propiedades -> Ruta del constructor de Java -> dependencias de android
Vi el mismo mensaje de error después de hacer una actualización simple de mi aplicación. Solucionado al hacer esto:
Project->Build automatically OFF
Project->Clean->Selcting my project
Luego hice una nueva exportación de mi aplicación firmada, y funcionó.