Bidding Android iOS 快应用 SDK H5 SDK Media API 常见问题

断点续安装提示

简介

目前断点续安装提示的功能处于内测中,请开发者联系对应运营开通权限。

权限等级:需申请

前提要求Android SDK 4.250.1120 及 以上版本

断点续安装方式简介:用户在点击 app 类的广告后,会下载广告中的 apk 。由于当前安卓的安装链路过长,会存在一些已下载但未安装的 apk。通过断点续安装提示的接口,开发者可以拿到有效的 apk 做提示,由用户选择是否继续安装,从而提升 app 的安装率。

接入流程介绍

适用场景:断点续安装建议在用户退出APP时、或浏览使用APP中,不影响用户体验的情况下提示。提示的样式建议如下,开发者也可以根据APP设计样式。

  1. 弹窗提醒
  2. 浮层提醒
弹窗提醒
浮层提醒

主要 API

GDTApkManager

GDTApk 数据的管理类,用于初始化并拿到 apk 数据,然后进行安装。

方法名 方法介绍
GDTApkManager(Activity context, IGDTApkListener listener) 构造函数,context 是指上下文环境,这里必须传入开发者的 Activity,listener 是指 加载 GDTApk 的回调接口
loadGDTApk() 加载 GDTApk 数据,每调用一次只能获取一个 GDTApk
startInstall(GDTApk apk) 传入 loadGDTApk() 中拿到的 GDTApk 数据,调用系统安装器进行安装

IGDTApkListener

方法名 方法介绍
onApkLoad(GDTApk apk) 获取 GDTApk 数据
onError(AdError adError) 获取 GDTApk 数据时的一些错误信息提示

GDTApk

方法名 方法介绍
getPackageName() 获取 app 广告的包名
getTitle() 获取 app 广告的标题
getDesc() 获取 app 广告的描述信息
getAppName() 获取 app 广告的名字
getLogoUrl() 获取 app 广告的图标地址

接入注意事项

  1. com.qq.e.ads.dfa.IGDTApkListener 的两个接口回调 onApkLoad(GDTApk apk)onError(AdError adError) 中,都是在主线程中执行的;
  2. com.qq.e.ads.dfa.GDTApkManager中的 loadGDTApk() 方法属于耗时操作,但是开发者无需担心,因为是采取异步回调的方式返回给开发者的。

接入代码示例

/**
 * 当调用系统安装器 {@link com.qq.e.ads.dfa.GDTApkManager#startInstall(com.qq.e.ads.dfa.GDTApk)}后,
 * 界面会跳转到安装器的界面上,这个时候我们没有提供 apk 文件是否安装完成或者失败的回调。
 *
 * 所以,开发者可以利用 activity 或者 fragment 的生命周期回调,结合自己的业务逻辑,去做出正确的展示。
 * 
 * 比如,在 activity 中,从当前 app 跳转到系统安装器界面,会回调 onPause() -> onStop();
 * 从系统安装器界面返回到 app 中的时候,会回调 onRestart() -> onStart() -> onResume()。
 *
 * 当界面从系统安装器返回后,可以通过判断 apk 是否已经安装 {@link #isAPKInstalled(android.content.Context, java.lang.String)} 来更新视图
 */
public class GDTApkActivity extends Activity implements IGDTApkListener {

    private static final String TAG = GDTApkActivity.class.getSimpleName();

    private GDTApk mApk;
    private GDTApkManager mManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        mManager = new GDTApkManager(this, this);
    }

    /**
     * 开始安装
     * @param view
     */
    public void installApk(View view) {
        if (mManager != null) {
            mManager.startInstall(this.mApk);
            Log.i(TAG, "installApk");
        }
    }

    /**
     * 获取到 apk 文件的回调
     * @param apk
     */
    @Override
    public void onApkLoad(GDTApk apk) {
        if (apk != null) {
            this.mApk = apk;
            Log.i(TAG, this.mApk.toString());
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
        if (mApk != null && isAPKInstalled(this, mApk.getPackageName())) {
            // 更新你的视图
            Log.i(TAG, "apk 文件已经安装,可以更新你的视图");
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    /**
     * 获取 apk 文件
     * @param view
     */
    public void loadApk(View view) {
        if (mManager != null) {
            mManager.loadGDTApk();
            Log.i(TAG, "loadGDTApk");
        }
    }

    /**
     * 错误信息的回调
     * @param adError
     */
    @Override
    public void onError(AdError adError) {
        String msg = String.format(Locale.getDefault(), "onError, error code: %d, error msg: %s",
                adError.getErrorCode(), adError.getErrorMsg());
        Toast.makeText(GDTADManager.getInstance().getAppContext(), msg, Toast.LENGTH_LONG).show();
    }

    /**
     * 该方法用于判断某个 apk 是否已经安装
     * @param context
     * @param pkgName
     * @return
     */
    private boolean isAPKInstalled(Context context, String pkgName) {
        if (StringUtil.isEmpty(pkgName)) {
            return false;
        }
        PackageManager pm = context.getPackageManager();
        try {
            PackageInfo packageInfo = pm.getPackageInfo(pkgName, PackageManager.GET_GIDS);
            return packageInfo != null;
        } catch (Throwable e) {
            return false;
        }
    }

}

 文档反馈

腾讯公司 版权所有