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?

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); 
  • Localización fuera de línea basada en la aplicación Android
  • retroceder de un viewpager hace que la aplicación se bloquee
  • Android Google Maps API v2 - cómo cambiar el icono de marcador
  • Cuestión de gesto con mapview en la página de viewpager
  • Error al obtener el error msg install failed missing shared library
  • Cancelar un brindis ya abierto en Android
  • Administración de las claves API de Google Maps
  • ¿Por qué el método onResume se va a ejecutar dos veces si la aplicación sigue ejecutando el método onCreate?
  • Acceso al método desde un fragmento en el botón Haga clic en MainActivity
  • Android: enrutamiento de Google Maps
  • Cómo obtener un objeto de Google Maps dentro de un fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.