Юридические уведомления API Карт Google v2 Строка слишком длинная

Я пытаюсь добавить в приложении для Android приложения для Google Maps v2 API, которые можно получить при вызове: GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()

Итак, мой код следующий:

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

Но когда я выполняю этот код, системе требуется около 10 секунд до того, как будет показано диалоговое окно (учитывая, что мое устройство является OnePlus One, кажется довольно странным).

Если я попытаюсь заменить LicenseInfo простой (более короткой) строкой, диалог будет открыт довольно быстро. Поэтому я думаю, что проблема связана с длиной информации о юридических уведомлениях, полученной из загрузочных приложений Google.

Как я могу решить эту проблему?

У меня была та же проблема, но я нашел это на GitHub и основал свое решение. Это помогает, но когда появляется диалоговое окно предупреждения, все еще остается небольшая зависание в потоке пользовательского интерфейса, но только на несколько секунд.

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(); } } 

Как предположил тасоман, использование WebView вместо TextView работает без проблем – есть небольшая задержка.

Вот полный код для отображения диалогового окна:

 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(); } 

Обязательно проверьте, не возвращает ли GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this) null , прежде чем вызывать legalDialog() .

На Motorola G5 под управлением Android 6 строка лицензии возвращается GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo() (или совсем недавно – GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity()) ) имеет длину более 600 000 символов. Задержка возникает при загрузке строки в TextView , которая должна выполняться в потоке пользовательского интерфейса.

LongStringLoader может быть решением этого. Полное раскрытие информации – я работал над командой разработчиков.

Другим решением было бы использовать WebView вместо TextView . У вас может быть очень маленький шаблон Html, и вы можете заполнить его тело текстом лицензии, который возвращается

String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);

Я не смог показать диалог прогресса, потому что пользовательский интерфейс зависает. Кроме того, время, затрачиваемое на часть времени, было когда dialog.show () имел место, и это не могло быть сделано в фоновом потоке. Вместо этого я изменил текст ссылки юридических уведомлений на «Please wait», а затем появился диалог с официальным уведомлением. Когда диалог отклонен, я изменил текст на «Юридические уведомления» (Ofcourse новое диалоговое окно заняло весь экран, на котором был покрыт мой фоновый текст. Если нет, то используйте dialog.setOnShowListener, чтобы изменить текст в / из Пожалуйста, подождите)

 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); } }); } }); 

При использовании WebView, как в ответе lenooh, лучше использовать TextUtils.htmlEncode(licenseInfo) вместо того, чтобы вручную преобразовывать строку в строку HTML.

 String licenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this); licenseInfo = TextUtils.htmlEncode(licenseInfo);