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

4

我正在尝试在我的安卓应用程序中添加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 play utils检索到的法律通知信息的长度。
我该如何解决这个问题?

我知道这可能是一个解决方案,但我真的很惊讶为了展示法律需要做这么多工作。 - GVillani82
LicenseInfo是什么?可能有其他更简单的方法来完成它,但将大量数据转储到动态生成的视图中可能会对您的设备造成相对较重的负担。 - zgc7009
官方网站上说:“如果您在应用程序中使用Google Maps Android API,则必须将Google Play服务归属文本作为“法律声明”部分包含在应用程序中。建议将法律声明作为独立菜单项或作为“关于”菜单项的一部分。通过调用GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo可获取归属文本。” - GVillani82
抱歉,我没有看到整个问题,滚动太远后忘记了您已经设置在上面。我做出了一个大胆的假设,认为获取字符串实际上需要一秒钟,而不是将其加载到视图中。如果是这种情况,您可以在初始加载时将字符串加载到共享首选项或其他位置,以便在需要时更容易提取。再次强调,这完全是假设。 - zgc7009
我要坦白地说,这对我来说似乎很奇怪。构建那个应该不需要那么长时间。你可以尝试创建一个单独的Activity,并将其主题设置为对话框,看看是否可以更有效地管理事物。我会尝试查看一下alertdialog builder是否会在长文本上出现问题,但我之前没有遇到过这种情况。 - zgc7009
显示剩余4条评论
6个回答

3
如tasomaniac所建议的,使用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();

    }

请确保在调用 legalDialog() 之前,检查 GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this) 是否返回 null

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
在运行Android 6的Motorola G5上,GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo()(或者更近期的GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(getActivity()))返回的许可证字符串超过了600,000个字符。将该字符串加载到TextView中时会出现延迟,这必须在UI线程上完成。 LongStringLoader可能是解决方案。完整披露——我曾参与开发团队。

1
另一个解决方案是使用 WebView 而不是 TextView。您可以拥有一个非常小的 HTML 模板,并用由以下代码返回的许可证文本填充其正文:

String result = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);


0

由于UI冻结,我无法显示进度对话框。而且耗时部分是在dialog.show()执行时发生的,这无法在后台线程上完成。因此,我将法律声明链接的文本更改为“请稍候”,然后显示出带有法律声明的对话框。当对话框关闭时,我将文本改回“法律声明”(当然,新的对话框占据了整个屏幕,覆盖了我的背景文本。如果没有,则使用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);
                }
            });
        }
    });

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接