1. 程式人生 > >騰訊Bugly 自定義更新Dialog

騰訊Bugly 自定義更新Dialog

           在開發專案的過程中,為了解決App的崩潰問題以及快速解決線上版本出現嚴重Bug的需求,我們在專案中接入了騰訊的Bugly,在更新提示時我們可以選擇自定義的樣式,我們專案裡自定義的樣式如下圖所示:


下面介紹一下主要的整合過程,步驟以及主要事項:

1.準備工作:

       首先要去騰訊的Bugly,註冊bugly賬號以及新增產品,主要過程是https://bugly.qq.com 這個網址直接用qq登入,然後點選右上角-我的產品,如果沒有新增過產品的話,點選"使用者名稱",選擇"我的App"

點選註冊新App,填寫完應用基本資訊完成註冊,即可得到Bugly AppID。

2.接入指南:

在Module的buid.gradle檔案中新增依賴和屬性配置:

android {
  defaultConfig {
    ndk {
      //設定支援的SO庫架構
      abiFilters 'armeabi'  //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
    }
  }
}
dependencies {
	//註釋掉原有bugly的倉庫
    //    compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本號,也可以指定明確的版本號,例如1.2.9
	compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 其中latest.release指代最新版本號,也可以指定明確的版本號,例如1.0.0
}

注意:

內測SDK已經整合crash上報功能,已經整合Bugly的使用者需要註釋掉原來Bugly的jcenter庫;

自動整合時會自動包含Bugly SO庫,建議在Module的build.gradle檔案中使用NDK的“abiFilter”配置,設定支援的SO庫架構

如果在新增“abiFilter”之後Android Studio出現以下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

則在專案根目錄的gradle.properties檔案中新增:

android.useDeprecatedNdk=true
3.引數配置

接入Bugly後,在AndroidManifest.xml中新新增如下許可權:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<!--儲存資源到SD卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

請避免混淆內測SDK,在Proguard混淆檔案中增加一行配置:

-keep public class com.tencent.bugly.**{*;}
4.SDK初始化

獲取APP ID並將以下程式碼複製到專案Application類onCreate()中,Bugly會自動檢測環境並啟用預設配置:

Bugly.init(getApplicationContext(), "註冊時申請的APPID", false);
5.自定義更新對話方塊(主要採用自定義activity的形式)

        在Application中新增以下資訊:

 private void initUpgradeDialog() {
        /**
         * 自定義初始化開關
         */
        Beta.autoInit = true;
        /**
         * true表示初始化時自動檢查升級; false表示不會自動檢查升級,需要手動呼叫Beta.checkUpgrade()方法;
         */
        Beta.autoCheckUpgrade = true;

        /**
         * 設定升級檢查週期為60s(預設檢查週期為0s)60sSDK不重複向後臺請求策略);
         */
//        Beta.upgradeCheckPeriod = 60 * 1000;
        /**
         * 設定啟動延時為1s(預設延時3s),APP啟動1s後初始化SDK,避免影響APP啟動速度;
         */
        Beta.initDelay = 1 * 1000;
        /**
         * 設定通知欄大圖示,largeIconId為專案中的圖片資源;
         */
        Beta.largeIconId = R.mipmap.app_icon;
        /**
         * 設定狀態列小圖示,smallIconId為專案中的圖片資源Id;
         */
        Beta.smallIconId = R.mipmap.app_icon;
        /**
         * 設定更新彈窗預設展示的bannerdefaultBannerId為專案中的圖片資源Id;
         * 當後臺配置的banner拉取失敗時顯示此banner,預設不設定則展示“loading“;
         */
        Beta.defaultBannerId = R.mipmap.app_icon;
        /**
         * 設定sd卡的Download為更新資源儲存目錄;
         * 後續更新資源會儲存在此目錄,需要在manifest中新增WRITE_EXTERNAL_STORAGE許可權;
         */
        Beta.storageDir = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        /**
         * 已經確認過的彈窗在APP下次啟動自動檢查更新時會再次顯示;
         */
        Beta.showInterruptedStrategy = true;
        /**
         * 只允許在MainActivity上顯示更新彈窗,其他activity上不顯示彈窗; 不設定會預設所有activity都可以顯示彈窗;
         */
        Beta.canShowUpgradeActs.add(MainActivity.class);

        /**
         * 設定Wifi下自動下載
         */
        Beta.autoDownloadOnWifi = true;

        /*application中初始化時設定監聽,監聽策略的收取*/
        Beta.upgradeListener = new UpgradeListener() {

            @Override
            public void onUpgrade(int ret, UpgradeInfo strategy, boolean isManual, boolean isSilence) {
                if (strategy != null) {
                    Log.e("bugly", "需要更新,存在更新策略");
                    new Handler().postDelayed(new Runnable() {
                        public void run() {
                            Intent i = new Intent();
                            i.setClass(getApplicationContext(), UpgradeActivity.class);
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(i);
                        }
                    }, 3000);

                } else {
                    Log.e("bugly", "不需要更新,沒有更新策略");
                }
            }
        };

      /* 設定更新狀態回撥介面 */
        Beta.upgradeStateListener = new UpgradeStateListener() {
            @Override
            public void onUpgradeSuccess(boolean isManual) {
                Toast.makeText(getApplicationContext(),"UPGRADE_SUCCESS",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onUpgradeFailed(boolean isManual) {
                Toast.makeText(getApplicationContext(),"UPGRADE_FAILED",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onUpgrading(boolean isManual) {
                Toast.makeText(getApplicationContext(),"UPGRADE_CHECKING",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onUpgradeNoVersion(boolean isManual) {
                Toast.makeText(getApplicationContext(),"UPGRADE_NO_VERSION",Toast.LENGTH_SHORT).show();
            }
        };
    }

注意:

    1.  UpgradeActivity就是自定義的activity,自己想要的一下佈局樣式可以定義

    2. 重點!!!!!!步驟5一定要在步驟4之前執行,Bugly的後臺策略一定要開啟,更新的對話方塊也要改成自定義UI

    3.介紹的可能不是特別詳細,大家可以參考:

https://bugly.qq.com/docs/user-guide/advance-features-android-beta/?v=20170912151050#2activity

  希望對大家有幫助,謝謝!