这里会显示出您选择的修订版和当前版本之间的差别。
razor:android-developer-guide [2015/03/24 16:50] cobub |
razor:android-developer-guide [2017/07/14 11:18] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | ~~Title:Android 开发者指南 - 开源移动应用运营平台 - 移动统计、移动推送解决方案 - Cobub 移动开发者中心~~ | ||
- | {{description>Android 开发者指南}} | ||
- | {{keywords>Cobub Razor,开源移动应用分析,移动分析,移动应用分析,开发者指南,android}} | ||
- | ====== Android 开发者指南 ====== | ||
- | |||
- | ====== 1 基本设置指南 ====== | ||
- | |||
- | ===== 1.1 注册应用,获取AppKey,下载开发文档 ===== | ||
- | |||
- | |||
- | 登陆账号后,到管理后台注册应用,填写Android应用的相关信息。App建立成功后,可获得该App的AppKey以及最新的开发文档。 | ||
- | |||
- | ===== 1.2 Android SDK使用步骤 ===== | ||
- | ==== 1.2.1 导入com.wbkit1.0.jar(简称SDK) ==== | ||
- | |||
- | |||
- | 打开放在服务端的android_sdk, 导入android_sdk到eclipse,打包生成的bin\classes下com文件夹为com.wbkit1.0.jar。 | ||
- | |||
- | Eclipse用户右键工程根目录,选择Properties —>Java Build Path —>libraries,然后点击Add External JARs…选择指向 com.wbkit1.0.jar的路径,点击OK,即导入成功。 | ||
- | |||
- | ==== 1.2.2 配置AndroidManifest.xml ==== | ||
- | 添加应用程序的AppKey(必须) | ||
- | 需要先添加应用程序获得的AppKey,将AppKey添加到AndroidManifest.xml的meta-data里。 | ||
- | |||
- | (注意:字符串必须为’**UMS_APPKEY**’) | ||
- | |||
- | * 添加权限**android.permission.INTERNET**(必须) | ||
- | 向服务器发送用户的统计分析数据。 | ||
- | |||
- | * 添加权限**android.permission.READ_PHONE_STATE**(必须) | ||
- | 获取手机的相关状态信息 | ||
- | |||
- | * 添加权限**android.permission.ACCESS_FINE_LOCATION**(必须) | ||
- | 获取当前用户的位置信息 | ||
- | |||
- | * 添加权限**android.permission.ACCESS_WIFI_STATE**(必须) | ||
- | 访问Wi-Fi网络状态信息 | ||
- | |||
- | * 添加权限**android.permission.GET_TASKS**(必须) | ||
- | 获取最近运行任务信息 | ||
- | |||
- | * 添加权限**android.permission.WRITE_EXTERNAL_STORAGE**(必须) | ||
- | 向sdcard读写文件 | ||
- | |||
- | * 添加权限**android.permission.READ_LOGS**(必须) | ||
- | 读取程序产生的错误日志 | ||
- | |||
- | * 添加权限**android.permission.ACCESS_NETWORK_STATE**(必须) | ||
- | 访问GSM网络信息 | ||
- | AndroidManifest.xml 文件详细如下: | ||
- | <code xml> | ||
- | <?xml version="1.0" encoding="utf-8"?> | ||
- | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
- | package="com.example.sdktest" | ||
- | android:versionCode="4" | ||
- | android:versionName="4.0.2" > | ||
- | |||
- | <uses-sdk | ||
- | android:minSdkVersion="9" | ||
- | android:targetSdkVersion="17" /> | ||
- | <uses-permission android:name="android.permission.READ_PHONE_STATE"/> | ||
- | <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> | ||
- | <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> | ||
- | <uses-permission android:name="android.permission.GET_TASKS"/> | ||
- | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | ||
- | <uses-permission android:name="android.permission.READ_LOGS"/> | ||
- | <uses-permission android:name="android.permission.INTERNET"/> | ||
- | <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | ||
- | | ||
- | <application | ||
- | android:allowBackup="true" | ||
- | android:icon="@drawable/ic_launcher" | ||
- | android:label="@string/app_name" | ||
- | android:theme="@style/AppTheme" > | ||
- | <activity | ||
- | android:name="com.example.sdktest.MainActivity" | ||
- | android:label="@string/app_name" > | ||
- | <intent-filter> | ||
- | <action android:name="android.intent.action.MAIN" /> | ||
- | |||
- | <category android:name="android.intent.category.LAUNCHER" /> | ||
- | </intent-filter> | ||
- | </activity> | ||
- | | ||
- | <meta-data android:name="UMS_APPKEY" android:value="填写获取到的key"/> | ||
- | </application> | ||
- | |||
- | </manifest> | ||
- | </code> | ||
- | ==== 1.2.3 添加代码 ==== | ||
- | 添加引用 | ||
- | **import com.wbtech.ums.UmsAgent;** | ||
- | |||
- | * 设置服务器URL | ||
- | 在Android应用的入口Activity的onCreate()方法中调用UmsAgent.setBaseURL(String url)方法,注意这个方法应置于所有其他的方法之前。 | ||
- | |||
- | * 获取用户ID | ||
- | 在可以获得用户唯一标识符的地方调用UmsAgent.bindUserIdentifier(String userID)方法,该方法会记录下该标示 符,以确定某一用户在使用该应用。该方法后需要调用UmsAgent.postClientData(Context con)方法(稍后介绍)才能将 数据上传至服务器,否则只在本地保存该用户的标示符记录。 | ||
- | |||
- | * 绑定tag | ||
- | 在可以获得用户tag的地方调用postTags(final Context context, final String tags),将tag数据传至后台,以后可用来对用户进行分类。 | ||
- | |||
- | * 注册Activity | ||
- | 在Android应用的每个Activity的onResume方法中调用**UmsAgent.onResume(Context)**,传入的参数为当前的context引用,这个方法将会自动地从AndroidManifest.xml文件里读取AppKey,并记录下用户进入该页面的时间。不要传递全局的application context。 | ||
- | <code java> | ||
- | protect void onResume(){ | ||
- | super.onResume(); | ||
- | UmsAgent.onResume(this); | ||
- | } | ||
- | </code> | ||
- | |||
- | 在Android应用的每个Activity的onPause方法中调用**UmsAgent.onPause(Context)**,参数为当前activity的context,该方法会记录下用户离开该页面的时间。 | ||
- | <code java> | ||
- | protected void onPause(){ | ||
- | super.onPause(); | ||
- | UmsAgent.onPause(this); | ||
- | } | ||
- | </code> | ||
- | |||
- | 在onCreate()调用**UmsAgent.postClientData(Context con)**方法,参数为当前上下文对象,这样,客户端数据就可以上传数据到服务器了。 | ||
- | <code java> | ||
- | public void onCreate(Bundle savedInstanceState) { | ||
- | super.onCreate(savedInstanceState); | ||
- | setContentView(R.layout.activity_main); | ||
- | UmsAgent.postClientData(this); | ||
- | } | ||
- | </code> | ||
- | 代码样例: | ||
- | <code java> | ||
- | public void onCreate(Bundle savedInstanceState) { | ||
- | super.onCreate(savedInstanceState); | ||
- | setContentView(R.layout.activity_main); | ||
- | button = (Button) findViewById(R.id.button1); | ||
- | UmsAgent.setBaseURL("http://192.168.1.204/UMS/index.php?"); | ||
- | UmsAgent.update(this); | ||
- | UmsAgent.onError(this); | ||
- | UmsAgent.setDefaultReportPolicy(this, 1); | ||
- | UmsAgent.bindUserIdentifier(this, "xd.."); | ||
- | UmsAgent.postClientData(this); | ||
- | button.setOnClickListener(new OnClickListener() { | ||
- | |||
- | @Override | ||
- | public void onClick(View v) { | ||
- | // TODO Auto-generated method stub | ||
- | UmsAgent.onEvent(MainActivity.this, "eventid"); | ||
- | UmsAgent.onEvent(MainActivity.this, "event_id", "label", 30.0); | ||
- | } | ||
- | }); | ||
- | |||
- | } | ||
- | </code> | ||
- | 1.2.4 集成说明 | ||
- | |||
- | 建议在Android应用的所有的activity中都调用UmsAgent.onResume()和UmsAgent.onPause()方法。如果在某些activity中不添加也可以,但会造成相应Activity的使用时间等相关信息统计不到。 | ||
- | |||
- | ==== 1.2.5 注意事项 ==== | ||
- | |||
- | |||
- | * AppKey | ||
- | 确认AppKey已经正确的写入Androidmanifest.xml | ||
- | |||
- | * 权限 | ||
- | 确认所需的权限都已经添加 | ||
- | |||
- | * API使用 | ||
- | 确认所有的Activity中都调用了onResume和onPause方法 | ||
- | |||
- | * 联网检查 | ||
- | 确认测试手机或者模拟器已成功连入网络 | ||
- | |||
- | ====== 2 高级基本设置指南 ====== | ||
- | |||
- | ===== 2.1 错误报告 ===== | ||
- | |||
- | |||
- | SDK可以帮您捕捉用户在使用应用过程中出现的异常退出(FC),并将错误报告发送给服务器,错误报告包含应用程序版本、操作系统版本和设备型号以及程序出现异常时的Stacktrace,这些数据将帮助您调试应用程序的错误。我们提供两种方式报告错误信息,一种是我们自动捕获的错误信息,一种是开发者自己传递的错误 | ||
- | |||
- | 前者,您需要在AndroidManifest.xml里面添加权限**android.permission.READ_LOGS**,并且在程序的Main Activity(应用程序入口)的onCreate方法里调用UmsAgent.onError(Context) | ||
- | <code java> | ||
- | public void onCreate(Bundle savedInstanceState) { | ||
- | super.onCreate(savedInstanceState); | ||
- | setContentView(R.layout.activity_main); | ||
- | UmsAgent.onError(this); | ||
- | </code> | ||
- | |||
- | 后者需要开发者调用**UmsAgent.onError(Context,String)**方法,在第二个参数中传入自己捕获的错误信息。 | ||
- | |||
- | ===== 2.2 自定义事件 ===== | ||
- | |||
- | |||
- | 除了基本统计分析功能外,SDK还支持您自定义的事件的统计分析,例如您可以统计广告点击次数或者视频被播放的次数等等,这里我们将提供几个简单而通用的接口: | ||
- | <code java> | ||
- | UmsAgent.onEvent(Context context,String event_id)</code> | ||
- | 在您需要发送事件报告的代码段,调用如下方法就可以向服务器发送事件记录,将统计event_id对应事件发送次数,变化趋势,例如广告点击,短信发送量等等。参数context为当前context的引用,event_id为当前统计事件的ID。 | ||
- | |||
- | 比如,监测应用程序里广告的点击次数,事件ID为“ad_click”。那么需要在程序里每次广告点击时调用UmsAgent.onEvent(this,“ad_click“)通知服务器一个广告点击事件发生。 | ||
- | <code java> | ||
- | UmsAgent.onEvent(Context context,String event_id,String label)</code> | ||
- | 除了能够统计event_id所对应事件的发生次数,变化趋势外,还能统计事件中具体标签所占的比例,label为当前标签,同样这里的event_id字符串中也不能有空格。 | ||
- | |||
- | 例如:在应用程序中省份对应一个event_id,每个城市对应一个label,这样我们可以再生成的统计表中看到不同城市的比例。 | ||
- | |||
- | 对于程序中的某些可能被频繁触发的事件,开发者可以再程序中维护一个计数器,这样事件被多次触发只需要生成一个消息,这个消息包括该事件被触发的次数,这里我们重载了之前的两个接口: | ||
- | <code java> | ||
- | UmsAgent.onEvent(Context context,String event_id,int acc)</code> | ||
- | <code java> | ||
- | UmsAgent.onEvent(Context context,String event_id,String label,int acc)</code> | ||
- | acc:对应事件被触发的次数。 | ||
- | |||
- | 这里我们除了可以对某个事件的发生次数统计外,增加了一个针对事件下某一标签的价值的保存和统计。重载方法如下: | ||
- | <code java> | ||
- | UmsAgent.onEvent(Context context,String event_id,String label,double value)</code> | ||
- | 例如 event_id代表一个“下单”事件,那么label可以标记为某个“订单号”,而value就为该“订单号”的金额(即价值)。 | ||
- | ===== 2.3 分发渠道分析 ===== | ||
- | |||
- | |||
- | 不同的发布渠道,对应着不同的appkey,统计结果可以使您很好的了解有多少用户从联想乐园或者Google android market 下载到您的应用程序。 | ||
- | |||
- | ====== 3 应用程序更新 ====== | ||
- | |||
- | ===== 3.1 上传APK ===== | ||
- | |||
- | |||
- | 这个功能将帮助您把新版的Android应用程序推送给用户,您只需修改AndroidManifest.xml中的VersionCode,并把应用程序的apk文件上传到服务器。 | ||
- | |||
- | ===== 3.2 添加权限 ===== | ||
- | |||
- | |||
- | **android.permission.WRITE_EXTERNAL_STORAGE** | ||
- | |||
- | ===== 3.3 基本功能 ===== | ||
- | 在Android应用程序的入口Activity的onCreate()方法中调用**UmsAgent.update(this)**,应用程序将自动检测服务端是否有新的版本。 | ||
- | <code java> | ||
- | public void onCreate(Bundle savedInstanceState) { | ||
- | super.onCreate(savedInstanceState); | ||
- | setContentView(R.layout.activity_main); | ||
- | UmsAgent.update(this); | ||
- | } | ||
- | </code> | ||
- | 考虑到用户流量的限制,目前我们默认在Wi-Fi介入情况下才进行自动提醒。 | ||
- | ===== 3.4 机制说明 ===== | ||
- | |||
- | |||
- | 每次更新Android应用程序,您只需要修改VersionCode,把Android应用程序的apk文件上传到服务器。UmsAgent.update()方法会判断是否有新版应用程序,如果发现可更新的应用程序安装包,会提示用户是否更新。用户选择更新后,安装包会下载安装更新。(按照version code来检测是否需要更新) | ||
- | |||
- | |||
- | ====== 4 数据发送 ====== | ||
- | |||
- | ===== 4.1 模式解释 ===== | ||
- | |||
- | |||
- | * 启动时发送(推荐使用) | ||
- | 应用程序每次只会在启动时向服务器发送一次消息,在应用程序过程中产生的所有消息都会在下次启动时候发送。如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。 | ||
- | |||
- | * 实时发送 | ||
- | 应用程序每产生条消息时,就立即发送到服务器 | ||
- | |||
- | ===== 4.2 设置发送模式 ===== | ||
- | 在Android应用程序的入口Activity中调用**UmsAgent.setDefaultReportPolicy(Context,int)**,参数int可取值0或者1,其中1表示实时发送,0表示启动时发送。 | ||
- | |||
- | |||
- | ====== 5 使用在线配置功能 ====== | ||
- | <code java> | ||
- | UmsAgent.updateOnlineConfig(Context)</code> | ||
- | 在Android应用程序的入口Activity的onCreate()方法中调用。SDK将联网检测您的在线配置,将这些信息保存在本地。你也可以通过下面的方法读取您的自定义参数。 | ||
- | |||
- | **UmsAgent.updateOnlineConfig(Context context,String key)** 其中key为在网站上编辑好的key,返回值是对应的value ,如果没有读到相应的value将返回空字符串。 |