断点续安装提示
简介
目前断点续安装提示的功能处于内测中,请开发者联系对应运营开通权限。
权限等级:需申请
前提要求:Android SDK 4.250.1120 及 以上版本
断点续安装方式简介:用户在点击 app 类的广告后,会下载广告中的 apk 。由于当前安卓的安装链路过长,会存在一些已下载但未安装的 apk。通过断点续安装提示的接口,开发者可以拿到有效的 apk 做提示,由用户选择是否继续安装,从而提升 app 的安装率。
接入流程介绍:
适用场景:断点续安装建议在用户退出APP时、或浏览使用APP中,不影响用户体验的情况下提示。提示的样式建议如下,开发者也可以根据APP设计样式。
- 弹窗提醒;
- 浮层提醒;
弹窗提醒 |
浮层提醒 |
---|---|
主要 API
GDTApkManager
- com.qq.e.ads.dfa.GDTApkManager:
GDTApk 数据的管理类,用于初始化并拿到 apk 数据,然后进行安装。
方法名 | 方法介绍 |
---|---|
GDTApkManager(Activity context, IGDTApkListener listener) | 构造函数,context 是指上下文环境,这里必须传入开发者的 Activity,listener 是指 加载 GDTApk 的回调接口 |
loadGDTApk() | 加载 GDTApk 数据,每调用一次只能获取一个 GDTApk |
startInstall(GDTApk apk) | 传入 loadGDTApk() 中拿到的 GDTApk 数据,调用系统安装器进行安装 |
IGDTApkListener
- com.qq.e.ads.dfa.IGDTApkListener:
断点续安装获取 GDTApk 数据 和 安装的回调接口。
方法名 | 方法介绍 |
---|---|
onApkLoad(GDTApk apk) | 获取 GDTApk 数据 |
onError(AdError adError) | 获取 GDTApk 数据时的一些错误信息提示 |
GDTApk
- com.qq.e.ads.dfa.GDTApk
接口返回的数据类 GDTApk。
方法名 | 方法介绍 |
---|---|
getPackageName() | 获取 app 广告的包名 |
getTitle() | 获取 app 广告的标题 |
getDesc() | 获取 app 广告的描述信息 |
getAppName() | 获取 app 广告的名字 |
getLogoUrl() | 获取 app 广告的图标地址 |
接入注意事项
- 在
com.qq.e.ads.dfa.IGDTApkListener
的两个接口回调onApkLoad(GDTApk apk)
和onError(AdError adError)
中,都是在主线程中执行的; - 在
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;
}
}
}