Adplayer 图片音视频广告混播

项目介绍

项目地址:https://github.com/licheedev/AdPlayer

简单的广告混播实现,没有类似 ViewPager 那样的切换滚动效果。

支持加载 url、本地文件、drawable 和 mipmap(仅图片)、raw 资源、asset 文件。

可以自定义图片加载器。

可以配置图片和视频的缩放模式。

添加依赖

app 的 build.gradle 中添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
        implementation 'com.github.licheedev:AdPlayer:1.0.3'
        implementation 'com.github.bumptech.glide:glide:4.9.0'
}

初始化

在 Application 中添加初始化代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ...
        AdPlayerConfig.instance().init(this)
            // 设置图片加载器(可选),默认使用Glide加载图片
            //.setImageLoader(new DefaultGlideImageLoader())
            // 设置视频缓存文件夹路径,可选
            //.setCacheDir(new File(this.getFilesDir(), "ad_dir"))
            // 设置视频文件下载器,可选,仅使用setUseFileLruCache()有效
            //.setVideoDownLoader(new DefaultVideoDownLoader())
            // 下面两种缓存策略互斥,二选一,只有最后设置的才生效
            // 缓存策略1,先下载文件到Lru文件缓存里面,再播放,首次下载会长时间显示loading界面
            //.setUseFileLruCache(1024 * 1024 * 1024L)
            // 缓存策略2,使用AndroidVideoCache边下边播
            .setUseVideoCache(new CacheServerCreator() {
                @Override
                public HttpProxyCacheServer getProxyCacheServer(File defaultCacheDir) {
                    HttpProxyCacheServer.Builder builder =
                        new HttpProxyCacheServer.Builder(App.this)
                            // 这里也可以自定义缓存路径
                            .cacheDirectory(defaultCacheDir)
                            // 缓存策略
                            .maxCacheSize(1024 * 1024 * 1024L); // 最大缓存文件总大小
                    // .maxCacheFilesCount(10); // 或者用这个,最大缓存文件个数
                    return builder.build();
                }
            });
    }
}

AndroidVideoCache缓存配置参考 这里

布局文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<com.licheedev.adplayer.AdView
    android:id="@+id/adView"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="#000000"
    app:ad_background_color="#000000"
    app:ad_enable_image_anim="false"
    app:ad_enable_video_anim="false"
    app:ad_image_scale_type="fitXY"
    app:ad_video_aspect_ratio="ratio_match_parent" />

属性解释:

  • ad_background_color: 广告默认背景颜色,默认为黑色 #000000.
  • ad_enable_image_anim: 开启图片过渡动画,默认 false.
  • ad_enable_video_anim: 开启视频过渡动画,默认 false.
  • ad_image_scale_type: 图片拉伸模式,默认 fitXY,全屏拉伸(图片比例差别大的,会变形)。
  • ad_video_aspect_ratio: 视频拉伸模式,默认 ratio_match_parent,全屏拉伸(视频比例差别大的,会变形)。
  • ad_override_error_layout: 自定义播放错误占位布局。
  • ad_override_loading_layout: 自定义 loading 等待占位布局。

Java 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MainActivity extends AppCompatActivity {
    @BindView(R.id.adView)
    AdView mAdView;
    private AdPlayer<AdData> mAdPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        // getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 屏幕常亮
        mUrls = new String[] {
            "http://www.aaa.com/statics/images/1.mp4",
            "http://www.aaa.com/statics/images/2.mp4",
            "http://www.aaa.com/statics/images/3.jpt",
            "http://www.aaa.com/statics/images/4.mp4"
        };
        // 创建播放器,并联控件
        mAdPlayer = new AdPlayer<>(mAdView);
        // 设置播放数据源,并开始播放
        mAdPlayer.setNewData(UrlAdData.convert(mUrls));
    }
    @Override
    protected void onResume() {
        super.onResume();
        mAdPlayer.resume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        mAdPlayer.pause();
    }
    @Override
    protected void onDestroy() {
        mAdPlayer.release();
        super.onDestroy();
    }
}

可选配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/////////////////////  配置AdPlayer
// 设置图片播放时长,默认5秒
mAdPlayer.setImageDuration(20000L);
// 设置播放出错时,显示出错界面的时间,默认5秒
mAdPlayer.setErrorDelay(2000L);
// 配置视频播放动作[是否跟图片一样长(默认false),是否要播完最后一次(上面一个参数为true才有效,默认true)]
mAdPlayer.setVideoDuration(true, true);
// 设置视频静音,默认1,1(静音0,0)
mAdPlayer.setVolume(1, 1);
// 设置广告点击事件监听,可选
mAdPlayer.setOnClickAdListener(new AdPlayer.OnClickAdListener<AdData>() {
    @Override
    public void onClickAd(AdData adData, int position) {
        Toast.makeText(MainActivity.this, adData.getURI().toString(), Toast.LENGTH_SHORT)
            .show();
    }
});
// 设置广告播放事件回调,可选
mAdPlayer.setOnOnPlayListener(new AdPlayer.OnPlayListener<AdData>() {
    @Override
    public void onSetNewData(@NonNull List<AdData> adDataList) {
        Toast.makeText(MainActivity.this, "新的广告数量=" + adDataList.size(), Toast.LENGTH_SHORT)
            .show();
    }
    /**
     * 设置播放数据
     * @param adData
     * @param position
     */
    @Override
    public void onPreparingAdData(AdData adData, int position) {
        LogPlus.i("onPreparingAdData", adData.getURI().toString());
    }
    /**
     * 准备好,正式开始播放(重复播放也会进这里)
     * @param adData
     * @param position
     */
    @Override
    public void onStartPlay(AdData adData, int position) {
        LogPlus.i("onStartPlay", adData.getURI().toString());
    }
    /**
     * 一个广告播放完毕
     * @param adData
     * @param position
     */
    @Override
    public void onPlayCompleted(AdData adData, int position) {
        LogPlus.i("onPlayCompleted", adData.getURI().toString());
    }
    /**
     * 播放出错
     * @param adData
     * @param position
     */
    @Override
    public void onPlayFailed(AdData adData, int position) {
        LogPlus.i("onPlayFailed", adData.getURI().toString());
    }
});



///////////////////// 配置AdView
// 设置过渡动画,可选
mAdView.setAnimateParams(0.1f, 500L);
// 设置动画插入器,可选
mAdView.setInterpolator(new DecelerateInterpolator());
//// 配置启用图片过渡动画,默认false
mAdView.setEnableImageAnim(true);
//// 配置启用视频过渡动画,默认false
mAdView.setEnableVideoAnim(true);

数据模板

URI 的实例操作可以借助 AdDataHelper 的各种 fromXxx() 和 toXxx() 方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class UrlAdData implements AdData {
    private final URI mURI;
    private final int mType;
    public UrlAdData(String url) {
        mURI = url == null ? URI.create("http://null") : AdDataHelper.fromUrl(url);
        if (isImage(url)) {
            mType = TYPE_IMAGE;
        } else if (isVideo(url)) {
            mType = TYPE_VIDEO;
        } else if (isMusic(url)) {
            mType = TYPE_MUSIC;
        } else {
            mType = TYPE_UNKNOWN;
        }
    }
    @Override
    public URI getURI() {
        return mURI;
    }
    @Override
    public int getType() {
        return mType;
    }
    public static boolean isImage(String url) {
        return StringUtils.containsIgnoreCase(url, ".jpg") //
            || StringUtils.containsIgnoreCase(url, ".jpeg") //
            || StringUtils.containsIgnoreCase(url, ".png") //
            || StringUtils.containsIgnoreCase(url, ".bmp") //
            || StringUtils.containsIgnoreCase(url, ".gif");
    }
    public static boolean isVideo(String url) {
        return StringUtils.containsIgnoreCase(url, ".mp4") //
            || StringUtils.containsIgnoreCase(url, ".avi") //
            || StringUtils.containsIgnoreCase(url, ".wmv") //
            ;
    }
    public static boolean isMusic(String url) {
        return StringUtils.containsIgnoreCase(url, ".mp3") //
            || StringUtils.containsIgnoreCase(url, ".aac") //
            || StringUtils.containsIgnoreCase(url, ".wma") //
            || StringUtils.containsIgnoreCase(url, ".wav") //
            || StringUtils.containsIgnoreCase(url, ".flac") //
            || StringUtils.containsIgnoreCase(url, ".ogg") //
            ;
    }
}

演示截图

AdPlayer 使用演示截图 AdPlayer 使用演示截图