Avisos legales de Google Maps API v2 Cadena demasiado larga

Estoy tratando de agregar, en mi aplicación para Android, los avisos legales para Google Maps v2 API, que se pueden obtener llamando a: GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()

Por lo tanto, mi código es el siguiente:

 String LicenseInfo = GooglePlayServicesUtil .getOpenSourceSoftwareLicenseInfo(getApplicationContext()); AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MyActivity.this); LicenseDialog.setTitle("Lagal Notices"); LicenseDialog.setMessage(LicenseInfo); LicenseDialog.show(); 

Pero cuando ejecuto este código, el sistema requiere unos 10 segundos antes de que se muestre el diálogo (considerando que mi dispositivo es OnePlus One, parece bastante extraño).

Si intento reemplazar el LicenseInfo con una cadena simple (más corta), el cuadro de diálogo abre bastante rápido. Así que creo que el problema es la longitud de la información de notificaciones legales recuperada de las utilidades de reproducción de Google.

¿Como puedó resolver esté problema?

6 Solutions collect form web for “Avisos legales de Google Maps API v2 Cadena demasiado larga”

Tuve el mismo problema, pero encontré esto en GitHub y basado mi solución en él. Esto ayuda, pero cuando el cuadro de diálogo de alerta muestra, todavía hay un pequeño colgar en el hilo de interfaz de usuario, pero sólo por unos segundos.

https://github.com/wf9a5m75/phonegap-googlemaps-plugin/blob/master/src/android/plugin/google/maps/AsyncLicenseInfo.java

 private class AsyncLoadLicenseInfo extends AsyncTask<Void,Void,AlertDialog.Builder> { @Override protected void onPreExecute() { progressDialog = new ProgressDialog(context); progressDialog.setIndeterminate(true); progressDialog.setMessage(context.getResources().getString(R.string.LegalNoticesLoading)); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected AlertDialog.Builder doInBackground(Void... params) { String googleAttribution = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(context); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder .setTitle(context.getResources().getString(R.string.AboutLegalNotices)) .setCancelable(false) .setMessage(googleAttribution) .setPositiveButton(context.getResources().getString(R.string.Close),null); return builder; } @Override protected void onPostExecute(AlertDialog.Builder builder) { AlertDialog attributionDialog = builder.create(); attributionDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { progressDialog.dismiss(); progressDialog = null; } }); attributionDialog.show(); } } 

Como sugirió tasomaniac, usar WebView lugar de TextView funciona sin problemas – sólo hay un pequeño retraso.

Aquí está el código completo para mostrar el diálogo:

 private void legalDialog(){ String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this); licenseInfo = licenseInfo.replace("\n", "<br/>"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.legal_notice); WebView webView = new WebView(this); webView.loadData("<html><body>"+licenseInfo+"</body></html>", "text/html", "utf-8"); WebSettings webSettings = webView.getSettings(); webSettings.setDefaultFontSize(12); builder.setView(webView); builder.setPositiveButton(R.string.dialog_close, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); final AlertDialog createDialog = builder.create(); createDialog.show(); } 

Asegúrese de comprobar si GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this) no devuelve null , antes de llamar a legalDialog() .

En un Motorola G5 con Android 6, la cadena de licencia devuelta por GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo() GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity()) (o más recientemente GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity()) ) tiene más de 600.000 caracteres. El retraso se produce al cargar la cadena en TextView , que debe realizarse en el subproceso de la interfaz de usuario.

LongStringLoader puede ser una solución a esto. Divulgación completa – Trabajé en el equipo de desarrollo.

Otra solución sería utilizar un WebView lugar de un TextView . Puede tener una plantilla Html muy pequeña y puede llenar su cuerpo con el texto de la licencia devuelto por

String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);

No pude mostrar un diálogo de progreso porque la interfaz de usuario se bloquea. Además, la parte que consumía mucho tiempo fue cuando dialog.show () se llevó a cabo y que no se podía hacer en un hilo de fondo. En cambio, cambié el texto del enlace de avisos legales a "Please wait" y luego mostré el diálogo con el aviso legal. Cuando el diálogo despedido cambié el texto de nuevo a "Avisos legales" (Por supuesto, el nuevo diálogo ocupó toda la pantalla donde se cubrió mi texto de fondo.Si no, utilice dialog.setOnShowListener para cambiar el texto a / desde Please Wait)

 legalNoticeTV.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { legalNoticeTV.setText(getResources().getString(R.string.please_wait)); legalNoticeTV.setEnabled(false); String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this); TextView tv = new TextView(this); tv.setBackgroundColor(getResources().getColor(R.color.dialogbackgroundcolorgrey)); tv.setText(result); tv.setPadding(8, 8, 8, 8); ScrollView sc = new ScrollView(this); sc.addView(tv); legalNotice = new Dialog(this, R.style.DialogNoTitle); legalNotice .requestWindowFeature(Window.FEATURE_NO_TITLE); legalNotice.setContentView(sc); legalNotice.show(); legalNotice.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { legalNoticeTV.setText(getResources().getString(R.string.legal_notices)); legalNoticeTV.setEnabled(true); } }); } }); 

Mientras usa WebView como en la respuesta de lenooh, es mejor usar TextUtils.htmlEncode(licenseInfo) lugar de convertir manualmente cadena a cadena HTML.

 String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this); licenseInfo = TextUtils.htmlEncode(licenseInfo); 
  • Android: la clave de API sólo se puede especificar una vez duplicados <meta-data>
  • Crear superposición Animación ImageView Google Map
  • No se pudo encontrar la clase 'com.google.android.gms.location.internal.ParcelableGeofence', referenciada desde el método glt.a
  • Mapas android carga asincrónica de elementos de superposición
  • La localización simulada no funciona en el mapa de Google
  • Cómo configurar google mapa fragmento dentro de la vista de desplazamiento
  • La aplicación comienza a buscar el GPS justo al iniciar la aplicación, no cuando es necesario
  • Decodificación de la polilínea con la nueva API de Google Maps
  • Android Maps V2: El relleno de polígono desaparece al alejar el zoom
  • Usar google maps sin conexión en una aplicación
  • Kindle Fire y Google Maps api
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.