studio messagedigest example android

example - ¿Qué es ''android.security.MessageDigest''?



sha256 android studio (3)

He encontrado trabajo simple alrededor! Simplemente cree en el paquete de directorio src android / security y coloque MessageDigest.java dentro.

package android.security; import java.security.NoSuchAlgorithmException; public class MessageDigest { private java.security.MessageDigest instance; public MessageDigest() {} private MessageDigest(java.security.MessageDigest instance) { this.instance = instance; } public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException { if (algorithm == null) return null; try { if (algorithm.equals("SHA-1")) return (MessageDigest) Class.forName("android.security.Sha1MessageDigest").newInstance(); else if (algorithm.equals("MD5")) return (MessageDigest) Class.forName("android.security.Md5MessageDigest").newInstance(); } catch (Exception e) {} return new MessageDigest(java.security.MessageDigest.getInstance(algorithm)); } public void update(byte[] input) { instance.update(input); } public byte[] digest() { return instance.digest(); } public byte[] digest(byte[] input) { return instance.digest(input); } }

¡Funciona, pero puede acumular otras excepciones debido a que la biblioteca de mapas no coincide con la versión de Android!

Uno de varios miles de clientes reportó un error en una de mis aplicaciones. El error es:

java.lang.NoClassDefFoundError - android.security.MessageDigest

No uso esa clase / método en mis aplicaciones. El Google Mapkey debe estar bien porque hay miles que ejecutan la misma aplicación con la misma versión felizmente. Aquí está el stacktrace:

java.lang.NoClassDefFoundError: android.security.MessageDigest at com.google.android.maps.KeyHelper.getSignatureFingerprint(KeyHelper.java:60) at com.google.android.maps.MapActivity.createMap(MapActivity.java:552) at com.google.android.maps.MapActivity.onCreate(MapActivity.java:422) at xx.yyy.zzzz.MyMapActivity.onCreate(MyMapActivity.java:41) at xx.yyy.zzzz.TheMap.onCreate(TheMap.java:89) at android.app.Activity.performCreate(Activity.java:4465) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) at android.app.ActivityThread.access$600(ActivityThread.java:123) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)

¿Que es esto?

Gracias por adelantado.


La clase MessageDigest es una clase auxiliar que se utiliza para codificar / decodificar claves, utilizando métodos comunes como MD5 o SHA-1.

Parece que la clase android.security.MessageDigest se eliminó de Honeycomb y versiones posteriores de Android, y debe ser reemplazada por java.security.MessageDigest ( vea esta página )

Intente descargar la última versión de la API de Google Maps y reconstruir su aplicación con targetSDK configurado al más alto disponible (a partir de hoy debería ser 16 / Jelly Bean).


Pasé un tiempo investigando este problema, y ​​estoy documentando lo que he encontrado aquí con la esperanza de que le ahorre algunos problemas a otras personas.

El error es el resultado de un fabricante de dispositivos o creador de ROM que utiliza una biblioteca de mapas más antigua con una nueva versión de Android. Por lo general, esto se aísla para ocultar las tabletas, pero en teoría podría aparecer en otras situaciones. Es posible volver a crear este problema en un emulador siguiendo estos pasos:

  1. Cree y cargue un emulador para una API más antigua (10 o menos) que incluya las API de Google
  2. Extraiga el jarra de mapas del emulador: adb pull /system/framework/com.google.android.maps.jar <destination_folder> Puede cerrar el emulador una vez que haya hecho esto.
  3. Cree y cargue un emulador para una nueva API (11 o superior) que incluya las API de Google
  4. Remount / sistema en el emulador para que pueda escribir en él: adb remount
  5. Coloque el tarro de mapas extraídos en el nuevo emulador: adb push <destination_folder>/com.google.android.maps.jar /system/framework
  6. Reinicie el emulador. Se supone que esto se puede hacer con un adb reboot pero eso acaba de colgar el emulador. En su lugar, deberás matar un proceso en particular que tenga el mismo efecto. En Eclipse / DDMS se llamará system_process y puedes matarlo allí. Alternativamente, puede ejecutar este comando: adb shell ps | grep system_server | awk ''{print $2}'' | xargs adb shell kill adb shell ps | grep system_server | awk ''{print $2}'' | xargs adb shell kill
  7. Después de reiniciar, puedes usar el emulador como lo harías normalmente. Ejecutar cualquier aplicación con un mapa de Google incorporado fallará.

Este proceso no es permanente. Al reiniciar el emulador, este vuelve a su estado normal de trabajo.

Es posible detectar este problema obteniendo el método KeyHelper.getSignatureFingerprint() en la biblioteca de mapas a través de la reflexión e invocándolo, pasando un PackageManager y el nombre de su paquete como argumentos. Alternativamente, puede interceptar el error en onCreate() y cargar una nueva actividad en su lugar.