Google Maps API v2法律声明字符串太长了

时间:2014-11-25 20:58:45

标签: android google-maps android-alertdialog

我试图在我的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,则Dialog的打开速度非常快。所以我认为问题是从Google Play utils检索到的法律声明信息的长度。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但我在GitHub上发现了这个问题,并根据我的解决方案。这确实有帮助,但是当警告对话框显示时,UI线程上仍然有一个小挂起但只持续几秒钟。

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

答案 1 :(得分:3)

正如tasmansiac建议的那样,使用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()

答案 2 :(得分:1)

在运行Android 6的Motorola G5上,GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()(或最近GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity()))返回的许可证字符串长度超过600,000个字符。将字符串加载到TextView时会发生延迟,必须在UI线程上完成。

LongStringLoader可能是解决此问题的方法。完全披露 - 我在开发团队工作。

答案 3 :(得分:1)

另一种解决方案是使用WebView代替TextView。 您可以拥有一个非常小的Html模板,并且可以使用

返回的许可文本填充其正文

String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);

答案 4 :(得分:0)

我无法显示进度对话框,因为用户界面冻结了。此外,耗时的部分是在dialog.show()发生时,并且无法在后台线程上完成。相反,我将法律声明链接的文本更改为“请稍候”,然后出现带有法律声明的对话框。当对话框被解除时,我将文本更改回“法律声明”(当然,新对话框占据了我的背景文本被覆盖的整个屏幕。如果没有,则使用dialog.setOnShowListener将文本更改为/从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);
                }
            });
        }
    });

答案 5 :(得分:0)

在lenooh的答案中使用WebView时,最好使用TextUtils.htmlEncode(licenseInfo)而不是手动将字符串转换为HTML字符串。

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