个推(消息推送)
Demo
快速入门说明;
步骤:
- 用自己的开发者账号登陆个推,进入控制界面;
- 在左侧菜单中选择 " 应用管理 ==> 应用管理 ==> 登记新应用"
在 "应用名称" 和 "应用标识" 中填入相应内容;
名称随便取,标识是app的package name; - 登记完新应用后,单击 " 应用管理 ==> 应用管理 ==> 应用详情 " 中看到各应用对应的详情信息;
- 下载SDK,解压,在文件夹中的 " 客户端/需要导入的资源 " 中,将armeabi文件夹及GetuiExt-x.x.x.jar、GetuiSdk-x.x.x.x.jar拷贝到项目中的libs目录(若无该目录,自建一个);
- 在项目的AndroidManifest中增加如下权限和服务声明:
权限:
<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.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="getui.permission.GetuiService"/> <uses-permission android:name="android.permission.GET_TASKS"/> <!--自定义权限--> <permission android:name="getui.permission.GetuiService" android:protectionLevel="normal"> </permission>
在<Application>标签内添加服务声明,并修改相应app信息(参见推控制台中的 " 应用管理 ==> 应用管理 ==> 应用详情 " ):
<!--个推SDK配置开始--> <!--配置第三方应用参数属性--> <meta-data android:name="PUSH_APPID" android:value="YOUR_APPID"/><!--替换为第三方应用的APPID--> <meta-data android:name="PUSH_APPKEY" android:value="YOUR_APPKEY"/><!--替换为第三方应用的APPKEY--> <meta-data android:name="PUSH_APPSECRET" android:value="YOUR_APPSECRET"/><!--替换为第三方应用的APPSECRET--> <meta-data android:name="PUSH_GROUPID" android:value=""/> <!--配置SDK核心服务--> <service android:name="com.igexin.sdk.PushService" android:exported="true" android:label="NotificationCenter" android:process=":pushservice"> </service> <receiver android:name="com.igexin.sdk.PushReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> <action android:name="android.intent.action.USER_PRESENT"/> <action android:name="com.igexin.sdk.action.refreshls"/> </intent-filter> </receiver> <receiver android:name="com.igexin.sdk.PushReceiver" android:exported="false"> <intent-filter> <action android:name="com.igexin.sdk.action.pushmanager"/> </intent-filter> </receiver> <activity android:name="com.igexin.sdk.PushActivity" android:excludeFromRecents="true" android:exported="false" android:process=":pushservice" android:taskAffinity="com.igexin.sdk.PushActivityTask" android:theme="@android:style/Theme.Translucent.NoTitleBar"> </activity> <!--配置弹框activity--> <activity android:name="com.igexin.getuiext.activity.GetuiExtActivity" android:configChanges="orientation|keyboard|keyboardHidden" android:excludeFromRecents="true" android:process=":pushservice" android:taskAffinity="android.task.myServicetask" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false"/> <receiver android:name="com.igexin.getuiext.service.PayloadReceiver" android:exported="false"> <intent-filter> <!--这个com.igexin.sdk.action.7fjUl2Z3LH6xYy7NQK4ni4固定,不能修改--> <action android:name="com.igexin.sdk.action.7fjUl2Z3LH6xYy7NQK4ni4"/> <!--替换为android:name="com.igexin.sdk.action.第三方的appId"--> <action android:name="com.igexin.sdk.action.YOUR_APPID"/> </intent-filter> </receiver> <service android:name="com.igexin.getuiext.service.GetuiExtService" android:process=":pushservice"/> <!--个推download模块配置--> <service android:name="com.igexin.download.DownloadService" android:process=":pushservice"/> <receiver android:name="com.igexin.download.DownloadReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> <provider android:name="com.igexin.download.DownloadProvider" android:process=":pushservice" android:authorities="downloads.com.getui.demo"/><!--替换为downloads.第三方包名--> <!--===========================================================================-->
- 初始化SDK
建议在程序住Activity中的onCreate()方法进行初始化,该方法必须在Activity或Service中进行调用,不建议在Application类中使用:import com.igexin.sdk.PushManager;
PushManager.getInstance().initialize(this.getApplicationContext());
- 配置到此完成,之后在个推控制台中 " 推送通知 ==> 新消息 " 中 "选择应用" 并 填写 " 通知标题 " 和 " 通知内容 " 等信息,单击下方的 " 发送通知 " 即可;
友盟(统计/反馈等)
开发文档:
作用: 应用统计及用户反馈等
应用统计
- 注册开发者账号,登录即可进入主页面:
- 单击左侧 " 下载SDK " 按需下载 , 并 " 添加新应用 " :
- 解压SDK,将libs目录下的文件合并到本地项目libs目录中;
- 添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- 在Application标签内设置key值(Appkey可在统计后台的 统计分析->设置->应用信息 页面查看):
"Channel ID" 替换为应用的推广渠道名称,如"google play"<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"></meta-data> <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
- 在每个Activity中集成如下代码,以便获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据:
注意:如果Activity之间有继承或者控制关系则不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计(eg.使用TabHost、TabActivity、ActivityGroup时)。public void onResume() { super.onResume(); MobclickAgent.onResume(this); } public void onPause() { super.onPause(); MobclickAgent.onPause(this); }
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口来自定义这个间隔(参数单位为毫秒):
注意:对于包含fragment的Activity,若要获得更详细的信息,请参看官网文档说明;MobclickAgent.setSessionContinueMillis(long interval)
- 设置发送策略:
在程序入口Activity中集成代码:
MobclickAgent.updateOnlineConfig( mContext );
- 配置结束,启动App,即可登陆umeng后台查看数据;
用户反馈
- 类似上面的操作,导入用户反馈的jar包,并将res目中layout/drawable/anim下的文件集成到本地项目中;
- 在项目manifest内声明相关Activity:
配置appKey,若上面已设置过,则略过本步:<!-- 友盟"反馈意见" --> <activity android:name="com.umeng.fb.ConversationActivity" android:theme="@android:style/Theme.NoTitleBar" /> <activity android:name="com.umeng.fb.ContactActivity" android:theme="@android:style/Theme.NoTitleBar" />
添加权限:<!-- 友盟统计 --> <meta-data android:name="UMENG_APPKEY" android:value="your appKey" > </meta-data> <meta-data android:name="UMENG_CHANNEL" android:value="chanel id" />
<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.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 若开发者回复用户反馈后,需要提醒用户,则在程序入口Activity的onCreate()方法中设置:
//友盟反馈意见 FeedbackAgent agent = new FeedbackAgent(this); agent.sync();
- 按需设置页面跳转:
startActivity(mContent, ConversationActivity.class));
- 完成用户反馈功能集合,若有需要可执行修改layout等文件;
百度地图
官网;
开发文档;
基础地图
- 准备动作都一样:注册开发者账号,登记应用,获取appID等信息;
登录后,单击右上角的" API控制台 ==> 创建应用 " ,按需填入信息即可获得 " 访问应用(ak) ",就是后面需要用到的密匙key了;
注意; 安全码由 " 数字签名 + 分号 + 包名 " 组成,其中数字签名在 Eclipse ==> window ==> preferences ==> Android ==> Build ==> SHA1 fingerprint; - 下载所需的sdk;
- 合并libs目录:
将armeabi目录下的libBaiduMapSDK_vx_x_x.so拷贝到本地项目同名文件夹内;
将BaiduLBS_Android.jar拷贝到本地项目libs目录内; - 配置Manifest:
在application标签内添加密匙key:
添加权限:<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="your key" />
<!-- 基础地图 --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 基础地图与定位功能共有的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 在Activity的布局xml文件件中添加地图控件:
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" />
- 在程序中初始化百度地图SDK并管理其生命周期:
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
定位功能
- 下载SDK,解压后将libs下的BaiduLBS_Android.jar 、locSDK_3.1.jar及 armeabi下的libBaiduMapSDK_v3_1_0.so、liblocSDK4d.so拷贝到项目中;
- 配置Manifest:
设置密匙key:
添加权限:<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="your key" />
添加服务:<!-- 定位权限 --> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- SD卡读取权限,用户写入离线定位数据 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 允许应用读取低级别的系统日志文件 --> <uses-permission android:name="android.permission.READ_LOGS" /> <!-- 基础地图与定位功能共有的权限 --> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 访问网络,网络定位需要上网 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 定位 --> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" />
- 同地图基础功能中第5/6条 : 添加地图控件及生命周期管理;
- 在onCreate()方法中初始化定位功能并运行:
其中 " mMapStatus = new MapStatus.Builder().zoom(14).build(); "用于设定地图初始化精度范围:super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); // 地图初始化 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 定位 mCurrentMode = LocationMode.NORMAL; mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); // 地图初始化显示精度 MapStatus mMapStatus = new MapStatus.Builder().zoom(14).build(); MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newMapStatus(mMapStatus); mBaiduMap.setMapStatus(mMapStatusUpdate); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener);//myListener为自定义监听函数,见下一步 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000); mLocClient.setLocOption(option); //別忘了运行 mLocClient.start();
//百度地图初始化精度 int BAIDU_MAP_5KM = 12; int BAIDU_MAP_2KM = 13; int BAIDU_MAP_1KM = 14; int BAIDU_MAP_500M = 15; int BAIDU_MAP_200M = 16; int BAIDU_MAP_100M = 17; int BAIDU_MAP_50M = 18;
- 设置定位SDK监听函数:
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; float radius = location.getRadius(); MyLocationData locData = new MyLocationData.Builder() .accuracy(radius) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } <span style="white-space:pre"> </span>// 添加悬浮物 initOverlay(location); } public void onReceivePoi(BDLocation poiLocation) { } }
- 添加悬浮物函数:
// 设置悬浮物 private boolean isShowInfoWindow; private InfoWindow mInfoWindow; public void initOverlay(BDLocation location) { // 定义Maker坐标点 LatLng point = new LatLng(location.getLatitude() + 0.01, location.getLongitude() + 0.01); // 构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.icon_tab_near_pressed); // 构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().position(point) .icon(bitmap); markerA = (Marker) mBaiduMap.addOverlay(option); // Marker点击事件 mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker arg0) { if (isShowInfoWindow) { mBaiduMap.hideInfoWindow(); isShowInfoWindow = false; } else { View overlayButton = getLayoutInflater().inflate( R.layout.overlay, null); final LatLng ll = markerA.getPosition(); /* * getProjection()获取地图投影坐标转换器, 当地图初始化完成之前返回 null,在 * OnMapLoadedCallback.onMapLoaded() 之后才能正常; * Projection接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换 */ /** * public Point toScreenLocation(LatLng location) * 将地理坐标转换成屏幕坐标 参数: location - 地理坐标 如果传入 null 则返回null 返回: * 屏幕坐标 */ Point p = mBaiduMap.getProjection().toScreenLocation(ll); p.y -= 40; LatLng llInfo = mBaiduMap.getProjection() .fromScreenLocation(p); OnInfoWindowClickListener listener = new OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { Toast.makeText(MainActivity.this, "悬浮物点击事件", Toast.LENGTH_SHORT).show(); } }; // InfoWindow 在地图中显示一个信息窗口,可以设置一个View作为该窗口的内容,也可以设置一个 // BitmapDescriptor 作为该窗口的内容。 mInfoWindow = new InfoWindow(overlayButton, llInfo, listener); mBaiduMap.showInfoWindow(mInfoWindow); isShowInfoWindow = true; } return false; } }); }
- 效果如下:
Demo源文件下载地址;
- 如果只是单纯想得到经纬度,则不必添加组件,前两步还是一样:
// 定位 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); private LocationMode mCurrentMode; BitmapDescriptor mCurrentMarker; boolean isFirstLoc = true;// 是否首次定位 private String tvCityLatLng; private void initLocation() { // 定位初始化 mCurrentMode = LocationMode.NORMAL; mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start(); }
- 设置监听:
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) { return; } if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); <span style="white-space:pre"> </span>//这里我写成http网址形式,是之前用于发短信的,可以直接通过连接打开谷歌地图进行定位 tvCityLatLng = "http://ditu.google.cn/?q=" + location.getLatitude() + "," + location.getLongitude(); System.out.println("首次定位坐标: " + tvCityLatLng); } } public void onReceivePoi(BDLocation poiLocation) { } }
- 生命周期管理:
备注:若在程序运行期间需要多次用到定位,则在监听事件MyLocationListenner()内if条件语句中添加标志位进行判断即可;@Override protected void onDestroy() { super.onDestroy(); // 退出时销毁定位 mLocClient.stop(); }