umeng 渠道统计 android
1、配置AndroidManifest.xml,添加权限
<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.INTERNET" />
2 在应用程序的 Application类的onCreate方法中调用Test类中的sendMessage方法,在方法中传入本应用的Appkey。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.Manifest.permission;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Environment;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log; public class Test {
private static final Pattern pattern = Pattern.compile("UTDID\">([^<]+)"); /**
* * send message To Server * * @param context * android Context. * @param*
* appkey * umeng appkey
*
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("deprecation")
public void sendMessage(Context context, String appkey)
throws UnsupportedEncodingException {
StringBuilder sber = new StringBuilder();
sber.append("https://ar.umeng.com/stat.htm?");
if (!TextUtils.isEmpty(appkey)) {
sber.append("ak=").append(appkey);
} String devicename = Build.MODEL; if (!TextUtils.isEmpty(devicename)) {
sber.append("&device_name=").append(
URLEncoder.encode(devicename, "UTF-8"));
} TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
PackageManager pm = context.getPackageManager(); if (pm.checkPermission(permission.READ_PHONE_STATE,
context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
String imei = tm.getDeviceId(); if (!TextUtils.isEmpty(imei)) {
sber.append("&imei=").append(URLEncoder.encode(imei,"UTF-8"));
}
} if (pm.checkPermission(permission.ACCESS_WIFI_STATE,
context.getPackageName()) == PackageManager.PERMISSION_GRANTED) { WifiManager wifi = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String mac = info.getMacAddress(); // String mac = tm.getDeviceId();
if (!TextUtils.isEmpty(mac)) {
sber.append("&mac=").append(URLEncoder.encode(mac,"UTF-8"));
}
} String androidId = Secure.getString(context.getContentResolver(),
Secure.ANDROID_ID);
if (!TextUtils.isEmpty(androidId)) {
sber.append("&android_id=").append(URLEncoder.encode(androidId,"UTF-8"));
} String utdid = getUTDid(context);
if (!TextUtils.isEmpty(utdid)) {
sber.append("&utdid=").append(URLEncoder.encode(utdid,"UTF-8"));
} HttpURLConnection conn = null;
try { conn = (HttpURLConnection) new URL(sber.toString())
.openConnection(); conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
int code = conn.getResponseCode();
if (code == 200) {
InputStream inputStream = conn.getInputStream(); // do something
} else {
Log.e("test", "status code: " + code);
}
} catch (Exception e) {
System.out.print(e.getMessage());
} finally {
if (conn != null) {
conn.disconnect();
}
}
} /**
* * get UTDID * * @param context * @return
*/
private String getUTDid(Context context) {
try {
Class<?> utdevice = Class.forName("com.ut.device.UTDevice");
Method reMethod = utdevice.getMethod("getUtdid", Context.class);
return (String) reMethod.invoke(null, context);
} catch (Exception e) {
return readNativeFile(context);
}
} //get mac /**
* * read native file method * * @param context * @return
*/
private String readNativeFile(Context context) {
File f = getFile(context);
if (f == null || !f.exists()) {
return null;
}
try {
FileInputStream fis = new FileInputStream(f);
try {
return parseId(readStreamToString(fis));
} finally {
safeClose(fis);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* * java pattern parse native utdid * * @param content * @return
*/
private String parseId(String content) {
if (content == null) {
return null;
}
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return matcher.group(1);
}
return null;
} /** * read native file * * @param context * @return */ private File getFile(Context context) {
PackageManager pm = context.getPackageManager();
if (pm.checkPermission(permission.WRITE_EXTERNAL_STORAGE,
context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
return null;
}
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File sdCardDir = Environment.getExternalStorageDirectory();
try {
return new File(sdCardDir.getCanonicalPath(),
".UTSystemConfig/Global/Alvin2.xml");
} catch (Exception ignore) {
}
}
return null;
} /**
* * convert inputstream to String * * @param input * @return * @throws
* IOException
* */
private String readStreamToString(InputStream input) throws IOException {
InputStreamReader reader = new InputStreamReader(input);
char[] buffer = new char[1024];
int n = 0;
StringWriter writer = new StringWriter();
while (-1 != (n = reader.read(buffer))) {
writer.write(buffer, 0, n); }
return writer.toString();
} /**
* * close io stream * * @param is
*/
private void safeClose(InputStream is) {
if (is != null) {
try {
is.close();
} catch (Exception e) { }
}
}
}
umeng 渠道统计 android的更多相关文章
- umeng 渠道统计ios
1. 使用前提:需要在工程中添加依赖框架:AdSupport.framework 和 Security.framework 2.在AppDelegate.m文件中的-(BOOL)application ...
- App渠道统计方法全面解析 总有一种适合你
一.App渠道统计对于App推广运营的重要性 (理解App渠道统计重要性的老司机,请直接移步到第二部分) App服务的竞争重点已经由功能竞争转向市场和运营的竞争,而App的推广与运营离不开App渠道统 ...
- openinstall渠道统计工具介绍
大家好,今天给大家介绍一下如何使用openinstall 来实现APP 渠道统计,做运营推广的朋友应该对渠道统计并不陌生,之前一般都是让技术的同事打渠道包方式进行渠道统计,而且只有安卓才能打渠道包.o ...
- 免打包:简单、灵活、便捷的APP渠道统计方法
相信做过APP运营推广的小伙伴们应该对APP渠道统计并不陌生吧.APP推广运营人员需要根据数据来评估渠道推广的效果,找到最适合自家APP的渠道,有针对性的投放,不断完善推广策略,这样才能更加精准.有效 ...
- 【python调用windows CLI】调用adb统计Android app的流量消耗
主要记录python如何调用windows CLI 手机连接PC,adb devices可以看到手机sn 通过adb 获取指定app的processID UID 读取Android /proc/ne ...
- jacoco统计Android手工测试覆盖率并自动上报服务器
改进了几个点 1. 不用借助Instrumentation启动,正常启动即可: 2. 测试代码不用push到主分支,主分支代码拉到本地后用git apply patch方式合并覆盖率代码: 3. 测试 ...
- 实现统计 android手机 CPU使用率
# -*- coding:utf-8 -*- ''' Created on Sep 10, 2018 @author: SaShuangYiBing ''' import subprocess imp ...
- android分渠道打包,监测日活量统计(基于友盟SDK)
客服说要看App日活,让加个统计功能. (我们技术部已经混到客服部都能直接提需求的地步) 首先接入友盟统计的SDK,在项目外层的build.gradle中添加依赖'https://dl.bintray ...
- Android应用发布后的统计——百度移动统计的应用
一个App发布到各个渠道之后,我们需要采集不同渠道的一些信息,比如app在运行过程中产生的一些异常信息,app在各个android版本的分布,以及各个app版本的分布,各渠道的用户数,用户忠诚度等等信 ...
随机推荐
- 服务器程序DEBUG
服务器程序DEBUG 服务器端设定 Tomcat 默认我们启动Tomcat是使用下边的命令 ./catalina.sh start 如果想DEBUG的话,只需要加一个参数打开JPDA(Java Pla ...
- php对xml文件进行CURD操作
XML是一种数据存储.交换.表达的标准: - 存储:优势在于半结构化,可以自定义schema,相比关系型二维表,不用遵循第一范式(可以有嵌套关系): - 交换:可以通过schema实现异构数据集成: ...
- RichTextBoxEx
using System; using System.Collections.Specialized; using System.Drawing; using System.Drawing.Imagi ...
- Dapper学习 - Dapper.Rainbow(三) - Read
前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法. 一.Read -- Rainbow原生 1. 先看测试代码 var conStr = ConfigurationMan ...
- [Asp.net 5] DependencyInjection项目代码分析2-Autofac
Microsoft.Framework.DependencyInjection.Autofac源码分析 该工程只有一个代码静态类AutofacRegistration,但是该类有3个扩展方法,以及3个 ...
- OracleHelper数据库事务处理
原理:需要开启事务的Action贴上Transaction标签,则Action执行前开启事务,Action执行完提交事务,如果Action报错,则回滚事务. OracleHelper代码: using ...
- 微信--获取jsapi_ticket 然后在计算出signature
最近做微信公众号,记录一下,仅供参看. 关于jsapi_ticket微信公众号有相关说明: 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临 ...
- SQL SERVER与C#中数据类型的对应关系
对应关系表 SQL Server2000 http://hovertree.com/menu/sqlserver/ C# CodeSmith 数据类型 取值范围 数据类型 取值范围 空值代替值 数据类 ...
- shell的比较运算符
运算符 描述 示例 文件比较运算符 -e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ] -d filename 如果 filename 为目录, ...
- ASP.NET入门教程:事件句柄
事件句柄(event handler)是一种针对给定事件来执行代码的子例程. ASP.NET - 事件句柄 请看下面的代码: <% lbl1.Text="The date and ti ...