Android 接入穿山甲激励视频广告步骤与错误总结
1.先去穿山甲官网,注册登录账号
2.侧边栏->广告变现->流量->应用->新建应用
3.侧边栏->广告变现->流量->代码位->新建代码位
4. 侧边栏->接入中心->SDK下载与接入文档
下载SDK,可以一边看文档一边写代码,一边参考SDK代码
打开页面如下:在工程配置那按照步骤集成SDK
在激励视频广告那按照步骤集成激励视频广告
5.详细步骤总结
一、SDK配置
1.从下载的SDK中复制open_ad_sdk.arr到 libs目录下
2. 在app的 build.gradle 中添加如下代码:
android {repositories {flatDir {dirs 'libs'}}
}dependencies {implementation(name: 'open_ad_sdk', ext: 'aar')
}
3.添加权限
<!--穿山甲-->
<!-- 必要权限 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 可选权限 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><uses-permission android:name="android.permission.VIBRATE" /> <!-- suppress DeprecatedClassUsageInspection --><uses-permission android:name="android.permission.GET_TASKS" /><uses-permissionandroid:name="android.permission.WAKE_LOCK"tools:node="remove" /><!-- 可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告 --><!-- 请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- demo场景用到的权限,不是必须的 --><uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> <!-- 建议添加“query_all_package”权限,穿山甲将通过此权限在Android R系统上判定广告对应的应用是否在用户的app上安装,避免投放错误的广告,以此提高用户的广告体验。若添加此权限,需要在您的用户隐私文档中声明! --><uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
注意,我在这儿加入了读取权限:
android:requestLegacyExternalStorage="true"
4.provider配置,在application标签里进行配置
<!--穿山甲SDK--><providerandroid:name="com.bytedance.sdk.openadsdk.TTFileProvider"android:authorities="${applicationId}.TTFileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider><!--穿山甲SDK--><providerandroid:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"android:authorities="${applicationId}.TTMultiProvider"android:exported="false" />
5.在xml文件夹下新建fie_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths><external-path name="tt_external_root" path="." /><external-path name="tt_external_download" path="Download" /><external-files-path name="tt_external_files_download" path="Download" /><files-path name="tt_internal_file_download" path="Download" /><cache-path name="tt_internal_cache_download" path="Download" />
</paths>
至此,SDK配置完成
二、激励视频广告代码编写
1.目录结构
2.RewardVideoActivity:(其实参照SDK文件和说明文档一点一点来就行了,我直接在这个Activity里进行了初始化和视频加载,SDK中是分别编写的)
注意:mHorizontalCodeId 和 mVerticalCodeId 改为自己新建项目的代码位(不过我在项目中没用到mHorizontalCodeId,给注释了,主要关注 mVerticalCodeId 这个就行)
package com.example.testdemo;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.annotation.Nullable;import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
import com.example.testdemo.utils.RewardAdvancedInfo;
import com.example.testdemo.utils.RewardBundleModel;
import com.example.testdemo.utils.TToast;import static com.bytedance.sdk.openadsdk.TTAdLoadType.PRELOAD;//穿山甲
public class RewardVideoActivity extends Activity {private static final String TAG = "OneActivity";private Button mLoadAd;private Button mLoadAdVertical;private Button mShowAd;private TTAdNative mTTAdNative;private String mHorizontalCodeId;private String mVerticalCodeId;private TTRewardVideoAd mttRewardVideoAd;private boolean mIsLoaded = false;// 是否开放进阶奖励功能private final boolean isEnableAdvancedReward = false;private RewardAdvancedInfo mRewardAdvancedInfo;private int mNowPlayAgainCount = 0;private int mNextPlayAgainCount = 0;private boolean mHasShowDownloadActive = false;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_reward_video);// 返回按钮
// findViewById(R.id.btn_arv_back).setOnClickListener(new View.OnClickListener() {// @Override
// public void onClick(View v) {// finish();
// }
// });
// mLoadAd = (Button) findViewById(R.id.btn_reward_load);mLoadAdVertical = (Button) findViewById(R.id.btn_reward_load_vertical);mShowAd = (Button) findViewById(R.id.btn_reward_show);getExtraInfo();initClickEvent();// 1.初始化穿山甲SDKTTAdConfig();
// 2.手动授权,我直接写Manitest里了,但是现在好像都需要手动授权了,这里我没写
// 3.创建TTAdNative对象,用于调用广告请求接口mTTAdNative = TTAdSdk.getAdManager().createAdNative(this);}private void getExtraInfo() {Intent intent = getIntent();if (intent == null) {return;}
// mHorizontalCodeId = intent.getStringExtra("horizontal_rit");
// mVerticalCodeId = intent.getStringExtra("vertical_rit");
// mHorizontalCodeId = "950516680";mVerticalCodeId = "950513057";}private void initClickEvent() {// mLoadAd.setOnClickListener(new View.OnClickListener() {// @Override
// public void onClick(View v) {//
// loadAd(mHorizontalCodeId);
// }
// });mLoadAdVertical.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {loadAd(mVerticalCodeId);}});mShowAd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//当mIsLoaded标识为true 代表广告视频本地加载完整 可直接开启一个主线程处理showRewardVideoAdif (mttRewardVideoAd != null && mIsLoaded) {//step6:在获取到广告后展示,强烈建议在onRewardVideoCached回调后,展示广告,提升播放体验//该方法直接展示广告
// mttRewardVideoAd.showRewardVideoAd(RewardVideoActivity.this);//展示广告,并传入广告展示的场景mttRewardVideoAd.showRewardVideoAd(RewardVideoActivity.this, TTAdConstant.RitScenes.CUSTOMIZE_SCENES, "scenes_test");mttRewardVideoAd = null;} else {TToast.show(RewardVideoActivity.this, "请先加载广告");}}});}public void loadAd(final String codeId) {// 4。 创建广告请求参数AdSlot,具体参数含义参考文档AdSlot adSlot = new AdSlot.Builder().setCodeId(codeId)
// .setRewardName("饲料") //奖励的名称 选填 -已废弃
// .setRewardAmount(300) //奖励的数量 选填 -已废弃//模板广告需要设置期望个性化模板广告的大小,单位dp,激励视频场景,只要设置的值大于0即// 且仅是模板渲染的代码位ID使用,非模板渲染代码位切勿使用
// .setExpressViewAcceptedSize(500,500) /
// .setUserID("tag123")//tag_id
// .setMediaExtra("media_extra") //附加参数.setOrientation(TTAdConstant.VERTICAL) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL.setAdLoadType(PRELOAD)//推荐使用,用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,方便后续为开发者优化相关策略.build();// 5. 请求广告 -异步加载广告mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {@Overridepublic void onError(int code, String message) {Log.e(TAG, "Callback --> onError: " + code + ", " + String.valueOf(message));TToast.show(RewardVideoActivity.this, message);}//视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。@Overridepublic void onRewardVideoCached() {Log.e(TAG, "Callback --> onRewardVideoCached");mIsLoaded = true;TToast.show(RewardVideoActivity.this, "Callback --> rewardVideoAd video cached");}@Overridepublic void onRewardVideoCached(TTRewardVideoAd ad) {Log.e(TAG, "Callback --> onRewardVideoCached");mIsLoaded = true;TToast.show(RewardVideoActivity.this, "Callback --> rewardVideoAd video cached");
// ad.showRewardVideoAd(RewardVideoActivity.this, TTAdConstant.RitScenes.CUSTOMIZE_SCENES, "scenes_test");//当mIsLoaded标识为true 代表广告视频本地加载完整 可直接开启一个主线程处理showRewardVideoAd}// 广告加载完成的回调 //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。@Overridepublic void onRewardVideoAdLoad(TTRewardVideoAd ad) {Log.e(TAG, "Callback --> onRewardVideoAdLoad");TToast.show(RewardVideoActivity.this, "rewardVideoAd loaded 广告类型:" + getAdType(ad.getRewardVideoAdType()));mttRewardVideoAd = ad;// 6. 广告交互监听器mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {//视频广告展示回调@Overridepublic void onAdShow() {Log.d(TAG, "Callback --> rewardVideoAd show");TToast.show(RewardVideoActivity.this, "rewardVideoAd show");}//广告的下载bar点击回调@Overridepublic void onAdVideoBarClick() {Log.d(TAG, "Callback --> rewardVideoAd bar click");TToast.show(RewardVideoActivity.this, "rewardVideoAd bar click");}//视频广告关闭回调@Overridepublic void onAdClose() {Log.d(TAG, "Callback --> rewardVideoAd close");TToast.show(RewardVideoActivity.this, "rewardVideoAd close");if (isEnableAdvancedReward && mRewardAdvancedInfo != null) {Log.d(TAG, "本次奖励共发放:" + mRewardAdvancedInfo.getRewardAdvancedAmount());}}//视频播放完成回调@Overridepublic void onVideoComplete() {Log.d(TAG, "Callback --> rewardVideoAd complete");TToast.show(RewardVideoActivity.this, "rewardVideoAd complete");}//视频广告播放错误回调@Overridepublic void onVideoError() {Log.e(TAG, "Callback --> rewardVideoAd error");TToast.show(RewardVideoActivity.this, "rewardVideoAd error");}//视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称,code:错误码,msg:错误信息@Overridepublic void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName,int errorCode, String errorMsg) {String logString = "verify:" + rewardVerify + " amount:" + rewardAmount +" name:" + rewardName + " errorCode:" + errorCode + " errorMsg:" + errorMsg;Log.e(TAG, "Callback --> " + logString);TToast.show(RewardVideoActivity.this, logString);}@Overridepublic void onRewardArrived(boolean isRewardValid, int rewardType, Bundle extraInfo) {RewardBundleModel rewardBundleModel = new RewardBundleModel(extraInfo);Log.e(TAG, "Callback --> rewardVideoAd has onRewardArrived " +"\n奖励是否有效:" + isRewardValid +"\n奖励类型:" + rewardType +"\n奖励名称:" + rewardBundleModel.getRewardName() +"\n奖励数量:" + rewardBundleModel.getRewardAmount() +"\n建议奖励百分比:" + rewardBundleModel.getRewardPropose());if (!isRewardValid) {Log.d(TAG, "发送奖励失败 code:" + rewardBundleModel.getServerErrorCode() +"\n msg:" + rewardBundleModel.getServerErrorMsg());return;}if (!isEnableAdvancedReward) {// 未使用进阶奖励功能if (rewardType == TTRewardVideoAd.REWARD_TYPE_DEFAULT) {Log.d(TAG, "普通奖励发放,name:" + rewardBundleModel.getRewardName() +"\namount:" + rewardBundleModel.getRewardAmount());}} else {// 使用了进阶奖励功能if (mRewardAdvancedInfo != null) {mRewardAdvancedInfo.proxyRewardModel(rewardBundleModel, false);}}}//视频广告跳过回调@Overridepublic void onSkippedVideo() {Log.e(TAG, "Callback --> rewardVideoAd has onSkippedVideo");TToast.show(RewardVideoActivity.this, "rewardVideoAd has onSkippedVideo");}});/其实到这儿就没了,但是为了严谨,增加了再看一个的回调 和 下载的回调///mttRewardVideoAd.setRewardPlayAgainInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {@Overridepublic void onAdShow() {mNowPlayAgainCount = mNextPlayAgainCount;Log.d(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain show");TToast.show(RewardVideoActivity.this, "rewardVideoAd show");}@Overridepublic void onAdVideoBarClick() {Log.d(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain bar click");TToast.show(RewardVideoActivity.this, "rewardVideoAd bar click");}@Overridepublic void onAdClose() {// 再看广告不会调到这个回调}//视频播放完成回调@Overridepublic void onVideoComplete() {Log.d(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain complete");TToast.show(RewardVideoActivity.this, "rewardVideoAd complete");}@Overridepublic void onVideoError() {Log.e(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain error");TToast.show(RewardVideoActivity.this, "rewardVideoAd error");}//视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称@Overridepublic void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int errorCode, String errorMsg) {String logString = "rewardPlayAgain verify:" + rewardVerify + " amount:" + rewardAmount +" name:" + rewardName + " errorCode:" + errorCode + " errorMsg:" + errorMsg;Log.e(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 " + logString);TToast.show(RewardVideoActivity.this, logString);}@Overridepublic void onRewardArrived(boolean isRewardValid, int rewardType, Bundle extraInfo) {RewardBundleModel rewardBundleModel = new RewardBundleModel(extraInfo);Log.e(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain has onRewardArrived " +"\n奖励是否有效:" + isRewardValid +"\n奖励类型:" + rewardType +"\n奖励名称:" + rewardBundleModel.getRewardName() +"\n奖励数量:" + rewardBundleModel.getRewardAmount() +"\n建议奖励百分比:" + rewardBundleModel.getRewardPropose());if (!isEnableAdvancedReward) {// 再看一个未使用进阶奖励功能if (rewardType == TTRewardVideoAd.REWARD_TYPE_DEFAULT) {Log.d(TAG, "再看一个普通奖励发放,name:" + rewardBundleModel.getRewardName() +"\namount:" + rewardBundleModel.getRewardAmount());}} else {// 再看一个使用了进阶奖励功能if (mRewardAdvancedInfo != null) {mRewardAdvancedInfo.proxyRewardModel(rewardBundleModel, true);}}}@Overridepublic void onSkippedVideo() {Log.e(TAG, "Callback --> 第 " + mNowPlayAgainCount + " 次再看 rewardPlayAgain has onSkippedVideo");TToast.show(RewardVideoActivity.this, "rewardVideoAd has onSkippedVideo");}});mttRewardVideoAd.setRewardPlayAgainController(new TTRewardVideoAd.RewardAdPlayAgainController() {@Overridepublic void getPlayAgainCondition(int nextPlayAgainCount, Callback callback) {Bundle bundle = new Bundle();bundle.putBoolean(KEY_PLAY_AGAIN_ALLOW, true);bundle.putString(KEY_PLAY_AGAIN_REWARD_NAME, "饲料");bundle.putString(KEY_PLAY_AGAIN_REWARD_AMOUNT, nextPlayAgainCount + "g");mNextPlayAgainCount = nextPlayAgainCount;callback.onConditionReturn(bundle);}});mttRewardVideoAd.setDownloadListener(new TTAppDownloadListener() {@Overridepublic void onIdle() {mHasShowDownloadActive = false;}@Overridepublic void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {Log.d("DML", "onDownloadActive==totalBytes=" + totalBytes + ",currBytes=" + currBytes + ",fileName=" + fileName + ",appName=" + appName);if (!mHasShowDownloadActive) {mHasShowDownloadActive = true;}}@Overridepublic void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {Log.d("DML", "onDownloadPaused===totalBytes=" + totalBytes + ",currBytes=" + currBytes + ",fileName=" + fileName + ",appName=" + appName);}@Overridepublic void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {Log.d("DML", "onDownloadFailed==totalBytes=" + totalBytes + ",currBytes=" + currBytes + ",fileName=" + fileName + ",appName=" + appName);}@Overridepublic void onDownloadFinished(long totalBytes, String fileName, String appName) {Log.d("DML", "onDownloadFinished==totalBytes=" + totalBytes + ",fileName=" + fileName + ",appName=" + appName);}@Overridepublic void onInstalled(String fileName, String appName) {Log.d("DML", "onInstalled==" + ",fileName=" + fileName + ",appName=" + appName);}});}});}private String getAdType(int type) {switch (type) {case TTAdConstant.AD_TYPE_COMMON_VIDEO:return "普通激励视频,type=" + type;case TTAdConstant.AD_TYPE_PLAYABLE_VIDEO:return "Playable激励视频,type=" + type;case TTAdConstant.AD_TYPE_PLAYABLE:return "纯Playable,type=" + type;case TTAdConstant.AD_TYPE_LIVE:return "直播流,type=" + type;}return "未知类型+type=" + type;}/*初始化穿山甲SDK*/private void TTAdConfig(){TTAdSdk.getAdManager().requestPermissionIfNecessary(this);TTAdConfig config=new TTAdConfig.Builder().appId("5352720").useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView.appName("TestDemo").allowShowNotify(true) //是否允许sdk展示通知栏提示.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合.supportMultiProcess(false)//是否支持多进程.needClearTaskReset()
// .injectionAuth(TTLiveTokenHelper.getInstance().useHostAuth() ? new TTInjectionAuthImpl() : null).build();TTAdSdk.init(this, config, new TTAdSdk.InitCallback() {@Overridepublic void success() {Log.i(TAG, "success: " + TTAdSdk.isInitSuccess());Log.i(TAG, "success: 初始化穿山甲成功");}@Overridepublic void fail(int code, String msg) {Log.i(TAG, "fail: code = " + code + " msg = " + msg);}});}
}
3.activity_reward_video.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:ignore="HardcodedText"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- <Button-->
<!-- android:id="@+id/btn_arv_back"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:drawablePadding="2dp"-->
<!-- android:gravity="left|center_vertical"-->
<!-- android:paddingLeft="13dp"-->
<!-- android:text="Back"-->
<!-- android:textAllCaps="false"-->
<!-- android:textSize="15sp" />--><!-- <Button-->
<!-- android:id="@+id/btn_reward_load"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_marginTop="10dp"-->
<!-- android:layout_height="52dp"-->
<!-- android:layout_marginStart="8dp"-->
<!-- android:layout_marginLeft="8dp"-->
<!-- android:layout_marginEnd="8dp"-->
<!-- android:layout_marginRight="8dp"-->
<!-- android:gravity="center"-->
<!-- android:text="加载横版激励视频广告"-->
<!-- android:textColor="@android:color/black"-->
<!-- android:textSize="14sp"/>--><Buttonandroid:id="@+id/btn_reward_load_vertical"android:layout_width="match_parent"android:layout_height="52dp"android:layout_marginStart="8dp"android:layout_marginLeft="8dp"android:layout_marginEnd="8dp"android:layout_marginRight="8dp"android:gravity="center"android:text="加载竖版激励视频广告"android:textColor="@android:color/black"android:textSize="14sp"/><Buttonandroid:id="@+id/btn_reward_show"android:layout_width="match_parent"android:layout_height="52dp"android:layout_marginStart="8dp"android:layout_marginLeft="8dp"android:layout_marginEnd="8dp"android:layout_marginRight="8dp"android:gravity="center"android:text="展示激励视频广告"android:textColor="@android:color/black"android:textSize="14sp"/>
</LinearLayout>
4.记得在Mainifest.xml中注册该Activity
<activity android:name=".RewardVideoActivity"/>
6.错误总结
- compileSdkVersion 和 buildToolsVersion 要版本保持一致,具体报什么错忘记了
compileSdkVersion 29
buildToolsVersion "29.0.3" //这个我之前写的33.0.3就报错了
2. Android项目中出现了这个构建错误:unexpected element <queries> found in <manifest>解决方案
具体可以看我转载的这篇文章
我的错误:之前我的版本号为3.5.2改为3.5.4就好了
classpath 'com.android.tools.build:gradle:3.5.4'
3. 视频停留在暂停页面不播放,然后直接跳转播放结束
原因:缺少安全验证
在xml中新建随便一个xml文件,我新建的security.xml,具体内容为:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true" /><domain-config><domain includeSubdomains="true">i.snssdk.com</domain><domain includeSubdomains="true">is.snssdk.com</domain><domain includeSubdomains="true">pangolin.snssdk.com</domain><domain includeSubdomains="true">extlog.snssdk.com</domain><domain includeSubdomains="true">sf3-ttcdn-tos.pstatp.com</domain><domain includeSubdomains="true">bds.snssdk.com</domain><domain includeSubdomains="true">dig.bdurl.net</domain></domain-config>
</network-security-config>
然后在Manifest.xml中引入该文件:
android:networkSecurityConfig="@xml/security"
再运行视频就能正常播放了
4.java.lang.SecurityException: getUniqueDeviceId: The user 10397 does not meet the requirements to acc…
targetSdkVersion版本太高了,原来我是29,改为28了
为啥每次播的视频一样,官方给出了解释:
参考:
- Android项目中出现了这个构建错误:unexpected element <queries> found in <manifest>解决方案
- 穿山甲广告接入 视频加载成功 不播放直接跳到结束
- 穿山甲sdk激励视频广告关闭按钮引发的bug排查及解决
- java.lang.SecurityException: getDeviceId: The user 10158 does not meet the requirements to access de
Android 接入穿山甲激励视频广告步骤与错误总结相关推荐
- 穿山甲sdk激励视频广告关闭按钮引发的bug排查及解决
项目中接入了穿山甲广告,其中包括图文广告和视频广告,后期发现一个偶现的问题,就是看完激励视频广告后,点击视频页面的关闭按钮,此时回到了app源生页面,UI卡住了,本来看完视频有个加分操作,现在没了.排 ...
- Android 接入穿山甲SDK之Banner广告
大家可以先参考我的上一篇博客 信息流广告 传送门 首先创建一个脚本具体内容如下 package com.unity3d.player.chuanshanjia;import android.app.A ...
- 穿山甲和广点通激励视频广告打开失败的异常处理
由于项目里接入了广告,包括但不限于穿山甲sdk和广点通sdk,视频广告是收益比较高的广告,项目里面出现的地方比较多.流程一般都是UI上有个按钮,点击按钮,请求到激励视频广告,然后直接打开该广告,也就是 ...
- 微信小程序接入广告(banner广告 激励视频广告 插屏广告)
1.banner广告 <ad unit-id="{{ adUnitId }}"></ad> 2.视频广告 <ad unit-id="{{ a ...
- 小游戏内测激励视频广告,然而小程序最大的潜力是电商
4月25日,微信发布公告,宣布"为支持小游戏开发者更好将游戏场景与广告融合,现面向部分小游戏开发者启动激励式视频广告组件测试."这是去年3月小游戏与耐克尝试合作"基座广告 ...
- uniapp 小程序 加载显示激励视频广告
uniapp激励广告文档:uni-app官网https://uniapp.dcloud.io/api/a-d/rewarded-video微信官网激励广告文档:激励视频广告 | 微信开放文档微信开发者 ...
- cocos creator 微信小游戏 封装banner、原生格子、插屏、激励视频广告
创建WxPlatform.ts文件 封装bannger广告 class WxPlatform {//banner广告banner: BannerAd;showBanner() {if (cc.sys. ...
- 《波利大冒险》如何用激励视频广告优化游戏体验?
如今移动游戏爆款频出,可在智能手机尚未普及时,十年前的<QQ农场>也曾火遍全网,掀起了"全民偷菜"的现象级风潮:无独有偶,同期社交游戏公司Zynga以facebook作 ...
- cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk
cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk 开发者工具 0.1.26 版本开始支持调试广告组件 话说你们看完为什么不留言点赞? 首先,你需要初始化 ...
最新文章
- torch量化训练后导出onnx模型并运行
- 结合项目实例 回顾传统设计模式(二)观察者模式
- source insight(SI)怎么显示全路径?(不显示省略路径)(关闭Trim long path names with ellipses)
- [py2neo]Ubuntu14 安装py2neo失败问题解决
- Scala学习笔记:how to convert a StringRDD to Array
- c++ 命令行错误: 无法打开 元数据 文件_PostgreSQL:强大的开源对象关系数据库管理系统...
- nginx一个端口配置多域名服务
- 开发错误记录2 .MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
- 洛谷——P1116 车厢重组
- js的基本类型有哪些?引用类型有哪些?(二)------null和undefined的区别
- 25.TCP/IP 详解卷1 --- SNMP:简单网络管理协议
- 用报表工具Style Report制作排名前N名的分组报表
- easyui missingMessage
- 【AI】人工智能之深度学习(1)—— 入门
- win7旗舰版通知windows不是正版副本解决方法
- 软件工程师的工作经验总结
- Json 读文件错误:Expecting property name enclosed
- 7E3 Banding
- 基于MATLAB APP Designer 和 Python 的音视频剪辑App_02
- php ses 发送邮件,使用PHP SDK从Amazon SES发送HTML邮件