Android 应用接入广点通统计API 方案
官方给你参考文档,很扯淡,是c++和python脚本:
安卓java代码接入如下:
- package com.edaixi.util;
- import java.io.UnsupportedEncodingException;
- import java.net.SocketException;
- import java.net.URLEncoder;
- import java.security.MessageDigest;
- import android.annotation.SuppressLint;
- import android.content.Context;
- import android.telephony.TelephonyManager;
- import com.lidroid.xutils.HttpUtils;
- import com.lidroid.xutils.exception.HttpException;
- import com.lidroid.xutils.http.ResponseInfo;
- import com.lidroid.xutils.http.callback.RequestCallBack;
- import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
- public class TecentAdsUtil {
- private static Context mContext;
- public TecentAdsUtil(Context mContext) {
- super();
- TecentAdsUtil.mContext = mContext;
- }
- @SuppressWarnings("deprecation")
- public void getToTencentAds() throws SocketException {
- String encrypt_key = "*************";
- String IMEIString = getDeviceIMEI();
- String TimeString = getSystemTime();
- String query_string;
- try {
- query_string = "muid=" + URLEncoder.encode(IMEIString, "UTF-8")
- + "&conv_time=" + URLEncoder.encode(TimeString, "UTF-8");
- String page = "http://t.gdt.qq.com/conv/app/appid" + "/conv?"
- + query_string;
- String encode_page = URLEncoder.encode(page, "UTF-8");
- String property = "encrypt_key&GET&" + encode_page;
- String signature = string2MD5(property);
- String base_data = query_string + "&sign="
- + URLEncoder.encode(signature, "UTF-8");
- String base64 = ToBase64(base_data, encrypt_key);
- String data = new String(Base64Util.encode(base64.getBytes()));
- String attachment = "conv_type="
- + URLEncoder.encode("MOBILEAPP_ACTIVITE", "UTF-8")
- + "&app_type=" + URLEncoder.encode("ANDROID", "UTF-8")
- + "&advertiser_id=" + URLEncoder.encode("673411", "UTF-8");
- final String finalUrl = "http://t.gdt.qq.com/conv/app/1104311868/conv?v="
- + data + "&" + attachment;
- HttpUtils http = new HttpUtils();
- http.configTimeout(10 * 1000);
- http.send(HttpMethod.GET, finalUrl, new RequestCallBack<String>() {
- @Override
- public void onStart() {
- }
- @Override
- public void onFailure(HttpException arg0, String result) {
- }
- @Override
- public void onSuccess(ResponseInfo<String> result) {
- LogUtil.e("===广点通返回的结果==="+result.result);
- }
- });
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- @SuppressLint("DefaultLocale")
- public static String getDeviceIMEI() {
- String imei = ((TelephonyManager) mContext
- .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
- return string2MD5(imei.toLowerCase());
- }
- // 获取当前时间戳
- public static String getSystemTime() {
- long time = System.currentTimeMillis() / 1000;
- return time + "";
- }
- // MD5工具类
- public static String string2MD5(String inStr) {
- MessageDigest md5 = null;
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (Exception e) {
- System.out.println(e.toString());
- e.printStackTrace();
- return "";
- }
- char[] charArray = inStr.toCharArray();
- byte[] byteArray = new byte[charArray.length];
- for (int i = 0; i < charArray.length; i++)
- byteArray[i] = (byte) charArray[i];
- byte[] md5Bytes = md5.digest(byteArray);
- StringBuffer hexValue = new StringBuffer();
- for (int i = 0; i < md5Bytes.length; i++) {
- int val = ((int) md5Bytes[i]) & 0xff;
- if (val < 16)
- hexValue.append("0");
- hexValue.append(Integer.toHexString(val));
- }
- return hexValue.toString();
- }
- // Base64工具类
- public static String ToBase64(String base_data, String encrypt_key) {
- char[] base_datachar = base_data.toCharArray();
- char[] base_datacharBak = new char[base_datachar.length];
- char[] encrypt_keychar = encrypt_key.toCharArray();
- int j = 0;
- for (int i = 0; i < base_datachar.length; i++) {
- base_datacharBak[i] = (char) (base_datachar[i] ^ encrypt_keychar[j]);
- j = (++j) % (encrypt_keychar.length);
- }
- return new String(base_datacharBak);
- }
- }
- package com.edaixi.util;
- import java.io.UnsupportedEncodingException;
- public class Base64Util {
- private static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D',
- 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
- 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
- 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
- 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
- '4', '5', '6', '7', '8', '9', '+', '/' };
- private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 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, -1,
- -1, -1, -1, -1, -1, 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, -1, -1, -1,
- -1, -1 };
- public static String encode(byte[] data) {
- StringBuffer sb = new StringBuffer();
- int len = data.length;
- int i = 0;
- int b1, b2, b3;
- while (i < len) {
- b1 = data[i++] & 0xff;
- if (i == len) {
- sb.append(base64EncodeChars[b1 >>> 2]);
- sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
- sb.append("==");
- break;
- }
- b2 = data[i++] & 0xff;
- if (i == len) {
- sb.append(base64EncodeChars[b1 >>> 2]);
- sb.append(base64EncodeChars[((b1 & 0x03) << 4)
- | ((b2 & 0xf0) >>> 4)]);
- sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
- sb.append("=");
- break;
- }
- b3 = data[i++] & 0xff;
- sb.append(base64EncodeChars[b1 >>> 2]);
- sb.append(base64EncodeChars[((b1 & 0x03) << 4)
- | ((b2 & 0xf0) >>> 4)]);
- sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
- | ((b3 & 0xc0) >>> 6)]);
- sb.append(base64EncodeChars[b3 & 0x3f]);
- }
- return sb.toString();
- }
- public static byte[] decode(String str) throws UnsupportedEncodingException {
- StringBuffer sb = new StringBuffer();
- byte[] data = str.getBytes("US-ASCII");
- int len = data.length;
- int i = 0;
- int b1, b2, b3, b4;
- while (i < len) {
- /* b1 */
- do {
- b1 = base64DecodeChars[data[i++]];
- } while (i < len && b1 == -1);
- if (b1 == -1)
- break;
- /* b2 */
- do {
- b2 = base64DecodeChars[data[i++]];
- } while (i < len && b2 == -1);
- if (b2 == -1)
- break;
- sb.append((char) ((b1 << 2) | ((b2 & 0x30) >>> 4)));
- /* b3 */
- do {
- b3 = data[i++];
- if (b3 == 61)
- return sb.toString().getBytes("ISO-8859-1");
- b3 = base64DecodeChars[b3];
- } while (i < len && b3 == -1);
- if (b3 == -1)
- break;
- sb.append((char) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
- /* b4 */
- do {
- b4 = data[i++];
- if (b4 == 61)
- return sb.toString().getBytes("ISO-8859-1");
- b4 = base64DecodeChars[b4];
- } while (i < len && b4 == -1);
- if (b4 == -1)
- break;
- sb.append((char) (((b3 & 0x03) << 6) | b4));
- }
- return sb.toString().getBytes("ISO-8859-1");
- }
- }
Android 应用接入广点通统计API 方案的更多相关文章
- 腾讯广告联盟 Android SDK(广点通)demo的使用方式
1. 下载示例文件. 2. 解压之后的目录: 3. 使用android studio,选择import project,导入如图所示文件夹: 4. 重点来了,由于官方demo的上传时间很久远(大概是上 ...
- Android平台接入Facebook登录
官方教程地址: https://developers.facebook.com/docs/android/getting-started 开发环境为Android Studio,官方要求SDK最低版本 ...
- Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 - O 8.0 API level 26 2017-3-21 牛轧糖 Nougat ...
- cocos2d-js添加广点通插屏(通过jsb反射机制)
1.把广点通的jar包加入libs文件夹 2.修改AndroidManifest.xml文件 添加权限: <uses-permission android:name="android. ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- Android 6.0 新功能及主要 API 变更
运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...
- Android 支付宝接入时常见的问题
1.概述 首先说明下,Android支付宝接入用的是快捷支付,下载地址是https://b.alipay.com/order/techService.htm 支付宝移动接入地址https://b ...
- 百度统计API的使用
百度统计API的使用 在搭建自己博客的时候,希望自己能有个日志系统,能够看到PV.UV等信息,同时自己也搭建了个ELK系统,可惜服务器配置太低(1GHZ+1G内存),根本运行不起来.只能使用第三方的日 ...
- Android BLE与终端通信(五)——Google API BLE4.0低功耗蓝牙文档解读之案例初探
Android BLE与终端通信(五)--Google API BLE4.0低功耗蓝牙文档解读之案例初探 算下来很久没有写BLE的博文了,上家的技术都快忘记了,所以赶紧读了一遍Google的API顺便 ...
随机推荐
- MediaController
前言 本章内容是android.widget.MediaController,版本为Android 2.3 r1,翻译来自"唐明",再次感谢"唐明" !期待你一 ...
- 如风一样,飞翔------Day37
我一直都觉得自己是个反应没有那么敏锐的人,而不幸的是其实也是,所以,在菜鸟的头衔上,我不得不再背负上一个笨鸟的"光芒".我不苛求一飞冲天的传奇,却也有着不甘寂寞的激昂,我选择先飞, ...
- 一个C/C++结构体初始化有趣的现象
我们知道C语言当中结构可以使用{}进行初始化,例如有结构体定义如下: typedef struct type_t { int a; int b; int c; int d; }type_t; 我们可以 ...
- Java基础学习笔记2-循环
while循环与do while循环: while循环的格式: while(条件表达式) { 执行语句; } do while循环格式: do { 执行语句; } while(条件表达式); do w ...
- <原>ASP.NET 学习笔记之HTML helper中参数何时会是路由参数,何时又会是query string?
HTML helper中参数何时会是路由参数,何时又会是query string? @Html.ActionLink("Edit", "Edit", new ...
- iOS退出键盘的两种方式
1,可以让叫出键盘的那个控件,退出第一响应者; 例如:textField叫出的键盘,那么就可以调用textField.resignFirstResponder,达到谁叫出的键盘谁退回去 2,可以让叫出 ...
- JAVA关键字transient
转载自http://www.cnblogs.com/liuling/archive/2013/05/05/transient.html 1.transient关键字只能修饰变量,而不能修饰方法和类.注 ...
- 处理date类型对象的方式
在jsp中通过key属性映射到编译后jsp页面的name属性,通过model中的 setxxxx()方法将jsp页面通过wdatepicker插件产生的string类型的数据转换为timestamp类 ...
- Python进阶之自定义排序函数sorted()
sorted() .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",& ...
- echarts的使用总结;
题外话:好久没来博客园了,这几个月自己的工作经历可以算是相当丰富,其实一直不知道自己做web前端能做到什么时候,但是想说既然现在还在做着这个职位,就好好的学习.之前很少写js代码,来了新公司大多数都是 ...