android - play - no puedo instalar apk descargadas
Android: uso de DexClassLoader para cargar el archivo apk (3)
He chocado contra un muro. Cualquier ayuda sería apreciada. Tengo una aplicación que quiero usar DexClassLoader para cargar otro archivo apk.
Aquí está mi código:
DexClassLoader dLoader = new DexClassLoader("/sdcard/download/test.apk","/sdcard/download",null,ClassLoader.getSystemClassLoader().getParent());
Class calledClass = dLoader.loadClass("com.test.classname");
Intent it=new Intent(this, calledClass);
it.setClassName("com.test", "com.test.classname");
startActivity(it);
Ahora ya había instalado test.apk, así que cuando ejecuté el código anterior funcionó bien y puse en marcha la aplicación. Sin embargo, quiero poder ejecutar esto sin tener instalado test.apk (ya que eso anularía todo el punto de la aplicación). Así que lo desinstalé y cuando ejecuté mi aplicación nuevamente, recibo este error:
android.content.ActivityNotFoundException: Unable to find explicit
activity class {com.test/com.test.classname}; have you declared this
activity in your AndroidManifest.xml.
Así que estoy un poco perplejo aquí. Esta actividad está declarada en el Manifiesto de la apk que estoy tratando de ejecutar. No puedo declararlo en mis aplicaciones Manifest. ¿Algunas ideas?
Gracias craig
Aunque la pregunta es antigua, responderé porque luché un poco para encontrar una respuesta clara para tu misma pregunta para mí. Primero, me gustaría resaltar que un requisito claro en su pregunta es cargar una clase desde un .apk que aún no está instalado en el dispositivo. Por lo tanto, llamar al administrador de paquetes usando getPackageManager () y proporcionarle la ruta del paquete conducirá claramente a la excepción NameNotFoundException porque el .apk que tiene el paquete no está instalado en el dispositivo.
Por lo tanto, la manera de proceder con la carga de clases desde un archivo .apk que no está instalado en el dispositivo (es decir, solo tiene el .apk almacenado en un directorio en su SDCARD) es mediante el uso de DexClassLoader siguiente manera:
1- Asegúrese de tener el archivo .apk en un directorio en su tarjeta SDCARD. Tengo el mío Offloadme.apk en la carpeta de descargas de mi tarjeta SDCARD.
2- Agrega permiso de lectura en tu AndroidManifest.xml para permitir que tu aplicación lea desde el manifiesto.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3- Use las siguientes definiciones para definir la ruta de acceso de .apk, el nombre de la clase dentro del apk y el nombre del método en esa clase que le gustaría invocar:
final String apkFile =Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/Offloadme.apk";
String className = "com.khaledalanezi.offloadme.SimpleCalculator";
String methodToInvoke = "add";
4- Utilice DexClassLoader para cargar .apk y llame al método add en la clase SimpleCalculator utilizando la reflexión de la siguiente manera:
final File optimizedDexOutputPath = getDir("outdex", 0);
DexClassLoader dLoader = new DexClassLoader(apkFile,optimizedDexOutputPath.getAbsolutePath(),
null,ClassLoader.getSystemClassLoader().getParent());
try {
Class<?> loadedClass = dLoader.loadClass(className);
Object obj = (Object)loadedClass.newInstance();
int x =5;
int y=6;
Method m = loadedClass.getMethod(methodToInvoke, int.class, int.class);
int z = (Integer) m.invoke(obj, y, x);
System.out.println("The sum of "+x+" and "+"y="+z);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Tenga en cuenta que en mi ejemplo simple, agregué dos números usando el método de adición disponible en la clase SimpleCalculator cargado del archivo Offloadme.apk almacenado en mi tarjeta SDCARD y pude imprimir la respuesta correcta, que es 11.
Intenta usar el PathClassLoader de Android:
String packagePath = "com.mypackage";
String classPath = "com.mypackage.ExternalClass";
String apkName = null;
try {
apkName = getPackageManager().getApplicationInfo(packagePath,0).sourceDir;
} catch (PackageManager.NameNotFoundException e) {
// catch this
}
// add path to apk that contains classes you wish to load
String extraApkPath = apkName + ":/path/to/extraLib.apk"
PathClassLoader pathClassLoader = new dalvik.system.PathClassLoader(
apkName,
ClassLoader.getSystemClassLoader());
try {
Class<?> handler = Class.forName(classPath, true, pathClassLoader);
} catch (ClassNotFoundException e) {
// catch this
}
No puedes hacer eso. Incluso si puedes acceder a clases desde un archivo externo, Android aún no las conoce. Y no ejecuta actividades directamente, sino que solicita a Android que las ejecute, por lo que deben registrarse / instalarse en el sistema.