友盟应用联盟 Android SDK使用指南

1 应用联盟的加入

1.1 申请加入应用联盟Top

进入我的产品页面后,可以看到申请加入应用联盟的入口,点击后,会弹出窗口,请填写相应的内容,填写完成后,点击“立刻申请”按钮,即会发送申请,会有相应的管理员来联系您。申请通过或者被拒绝,之前填写的邮箱中,都会收到相应的邮件。

1.2 选择功能Top

申请通过后,在我的产品页面就会看到“应用联盟”字样,点击后会进入应用联盟页面。

点击后,会进入如下页面,若您的app已经集成完毕,则可点击下一步,若尚未集成,则参考第二章进行集成。

点击“下一步”按钮后,进入功能选取页面。若想加入友盟的交换网络进行换量,点击“加入交换网络”,输入相应的内容后,管理员会对该应用进行审核,审核通过后即可开始换量;若想自己接广告进行管理,或推广自己想推的app,则点击使用广告管理,填写相应内容即可。

2 SDK的集成

2.1 SDK的获取Top

    在 友盟网站 下载友盟应用联盟Android版SDK压缩包。

2.2 添加资源Top
  • 1. 将zip压缩包中的 umeng_appnetwork_android_sdk.jar 导入工程
  • 2. 将zip压缩包中的 res 文件夹拷贝到工程目录下,和你工程现有的res文件夹合并。(友盟应用联盟SDK里的资源文件名都是以" exchange_"开头,请确保你工程中没有以" exchange_"开头的资源文件。)
  • 3. 打开Android工程中文件 AndroidManifest.xml 

    a) 添加appkey。在<application>中添加

    					<meta-data android:value="xxxxxxxx" android:name="UMENG_APPKEY"></meta-data>
                                                    
    其中xxxxxxxx是您在友盟网站上为应用程序注册之后获得的app key,请将真实的app key替换掉xxxxxxxx。
    注意:meta-data要小写,不要大写。

    b) 添加访问权限 (权限说明)

    					<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_PHONE_STATE" />
    					<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                                                    

    c) 声明SDK用到的下载服务

    					<service android:exported="true"
    						<android:name="com.exchange.Public.DownloadingService"
    						<android:process=":DownloadingService">
    					</service>
                                                    

    下面是一个完整的AndroidManifest.xml文件的例子。

    				<?xml version="1.0" encoding="utf-8"?>
    				<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    					package="com.test.umeng" android:versionCode="1" android:versionName="1.0">
    					<application android:icon="@drawable/icon" android:label="@string/app_name">
    						<activity android:name=".UmengExchangeDemo" android:label="@string/app_name">
    							<intent-filter>
    								<action android:name="android.intent.action.MAIN" />
    								<category android:name="android.intent.category.LAUNCHER" />
    							</intent-filter>
    						</activity>
    						<service android:exported="true"
    								 android:name="com.exchange.Public.DownloadingService"
    								 android:process=":DownloadingService">
    						</service>
    						<meta-data android:value="xxxxxxxxxxxxxxxxxxxxxxxxx"
    								   android:name="UMENG_APPKEY"></meta-data>
    					</application>
    					<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_PHONE_STATE" />
    					<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    				</manifest>
                                                    

    2.3 显示推广应用Top

        在需要添加友盟应用联盟推广的Activity的onCreate()函数中添加:

    				public class SmallHandlerListBottom extends Activity {
    					@Override
    					public void onCreate(Bundle savedInstanceState) {
    						super.onCreate(savedInstanceState);
    						setContentView(R.layout.small_handler_activity);
    						ViewGroup rootLayout = (ViewGroup) findViewById(R.id.rootId);
    						ExchangeViewManager exchangeViewManager = new ExchangeViewManager();
    						exchangeViewManager.addView(this, rootLayout,
    						ExchangeConstants.type_small_handler_list_bottom);
    					}
    				}
                                                

        其中rootLayout 为对应Activity的布局文件的根元素。下面的例子是对应于上面的SmallHandlerListBottom Activity的布局文件(small_handler_activity.xml)。

    			<?xml version="1.0" encoding="utf-8"?>
    			<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    				android:orientation="vertical"
    				android:layout_width="fill_parent"
    				android:layout_height="fill_parent"
    				android:id="@+id/rootId"
    				android:background="@drawable/device" >
    			</LinearLayout>
                                            
2.4 选择显示样式Top

        下面列出了友盟应用联盟SDK所支持的所有样式,ExchangeViewManager.addView(Context context, ViewGroup rootLayout, int type)函数的第三个参数决定了不同的样式。

  • 1. 置底/顶抽屉,把手为一个小方块,拉开抽屉展示多个推广应用
    					ExchangeViewManager exchangeViewManager = new ExchangeViewManager(); 
    					exchangeViewManager.addView(this, rootLayout, ExchangeConstants.type_small_handler_list_bottom);
                                                    
    					ExchangeViewManager exchangeViewManager = new ExchangeViewManager(); 
    					exchangeViewManager.addView(this, rootLayout,ExchangeConstants.type_small_handler_list_top);
                                                    
  • 2. 类似于3, 拉开抽屉后通过GridView展示8个推荐应用。
    					ExchangeViewManager exchangeViewManager = new ExchangeViewManager(); 
    					exchangeViewManager.addView(this, rootLayout, ExchangeConstants.type_grid_view_bottom);
                                                    
    					ExchangeViewManager exchangeViewManager = new ExchangeViewManager(); 
    					exchangeViewManager.addView(this, rootLayout,ExchangeConstants.type_grid_view _top);
                                                    
  • 3. 自定义推广入口,如菜单中的"more",点击后添加新的推广展示页面
    					new ExchangeViewManager().addView(this, null, ExchangeConstants.type_list_curtain);
                                                    
  • 4. 嵌入式list
    					ViewGroup fatherLayout1 = (ViewGroup) this.findViewById(R.id.tab1);
    					ListView listView1 = (ListView) this.findViewById(R.id.list1);
    					new ExchangeViewManager().addView(this, fatherLayout1, listView1);
                                                    
        对应的布局文件如下:
    					<RelativeLayout android:layout_width="-1dp"
    						android:layout_height="-2dp">
    						<RelativeLayout android:layout_width="-1dp"
    							android:layout_height="-2dp" android:id="@+id/tab1"
    							android:layout_marginBottom="5dp" android:layout_marginLeft="5dp"
    							android:layout_marginRight="5dp">
    							<ListView android:id="@+id/list1" android:cacheColorHint="#00000000"
    								android:layout_width="fill_parent" android:dividerHeight="1px"
    								android:divider="#dedfde" android:listSelector="#00000000"
    								android:layout_height="-2dp">
    							</ListView>
    						</RelativeLayout>
    					</RelativeLayout>
                                                    
  • 5. 添加独立的banner,可放置在页面任何地方,点击后在新的页面展示详细信息
    					ExchangeViewManager exchangeViewManager = new ExchangeViewManager(); 
    					exchangeViewManager.addView(this, rootLayout, ExchangeConstants.type_standalone_handler);
                                                    
2.5 注意事项Top
  • 1.混淆注意事项
        由于sdk需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理.apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
    				-keep public class [package name].R$*{
    					public static final int exchange_*;
    				}
                                                
        这里[package name]是你的应用程序的包名(替换的时候请删除方括号)。例如,如果程序的package name叫com.demo, 那么就改为:
    				-keep public class com.demo.R$*{
    					public static final int exchange_*;
    				}
                                                
  • 2. 在非中文手机上,默认不展示推广内容。
        如果想在非中文手机上显示推广内容, 在请求数据之前将ExchangeConstants.ONLY_CHINESE设置为false。
    				public void onCreate(Bundle savedInstanceState) {
    					super.onCreate(savedInstanceState);
    					requestWindowFeature(Window.FEATURE_NO_TITLE);
    					setContentView(R.layout.splash_activity); 
    					ExchangeConstants.ONLY_CHINESE=false;
    					ViewGroup fatherLayout1 = (ViewGroup) this.findViewById(R.id.tab1);
    					ListView listView1 = (ListView) this.findViewById(R.id.list1);
    					new ExchangeViewManager().addView(this, fatherLayout1, listView1);
    				}
                                                
2.6 定制化变量Top

    可以通过设置下面的变量改变SDK默认的界面或者行为。

  • 1. ExchangeConstants.full_screen: 显示全屏推荐时是否隐藏系统工具栏
  • 2. ExchangeConstants.blur_switcher: 弹出窗口后是否使用阴影遮挡其他部分
  • 3. ExchangeConstants.ONLY_CHINESE: 是否在非中文环境下展示,默认关闭
  • 4. ExchangeConstants.banner_alpha:如果使用standAlone模式,可设置banner的透明度
  • 5. 隐藏推广栏。
           exchangeViewManager.hideBanner();
  • 6. 设置底部小把手的icon不占整行,ExchangeConstants.handler_auto_expand = false;
  • 7. 如果想要修改默认的列表元素显示样式, 可以修改文件
           对于嵌入式List: exchange_container_banner.xml
           对于置顶/底下把手:exchange_normal_banner.xml
           注意不要改变这两个文件里面元素的id, 但是可以改变他们的属性, 比如,android:visible, 字体颜色,大小等。
  • 8. 如果想实现分组功能, 可以传递一个ExchangeDataService给ExchangeViewManager, 示例如下。
                                    					ExchangeDataService exchangeDataService1 = new ExchangeDataService();
                                    					exchangeDataService1.setKeywords("app"); // 设置分组的关键词。
                                    					exchangeDataService1.autofill=0; //自主广告数量小的情况下,不要自动填充来自交往网络的广告。
                                    					new ExchangeViewManager(exchangeDataService1).addView(this,fatherLayout1, listView1);
                                                    
  • 9. 如果想在Logcat里面打印log,ExchangeConstants.DEBUG_MODE=true; 默认不打印Log。

2.7 说明Top

  • 1. 权限说明

android.permission.INTERNET向友盟的服务器请求应用推广数据。
android.permission.ACCESS_NETWORK_STATE检测网络状态。
android.permission.READ_PHONE_STATE这个权限仅为了获取用户手机的IMEI,利用哈希生成一个UUID,作为唯一的标识用户。
(如果您的应用会运行在无法读取IMEI的平板上,我们会将mac地址作为用户的唯一标识,请添加权限:android.permission.ACCESS_WIFI_STATE)
android.permission.WRITE_EXTERNAL_STORAGE缓存下载的应用到SD卡

3 技术支持

Top

如果您在集成友盟应用联盟SDK的过程中遇到任何问题, 欢迎联系我们的技术工程师。 如果您有好的建议,也欢迎和我们交流。

徐仙明陈彧堃
QQ: 1908425381QQ: 309576849
Email: xuxianming@umeng.com Email: chenyukun@umeng.com