发送手机物理标识请求

作为应用的重要关注指标-激活, 需要在每次启动时, 都上传手机的物理标识到服务器. 我来简述一下需要上传的信息.

1. 获取

激活信息主要包含:

1. AppId: 公司拥有多款应用, 标示本应用的类型.

2. Platform: 平台Android或者iOS.

3. SystemVersion: 在Android中, 代表Android版本号.

4. Version: 本应用的版本.

5. AppVersion: 本应用的服务器接口版本.

6. IMEI(International Mobile Equipment Identity): 国际移动设备标识, 手机身份.

7. DeviceId: 设备标示, 一般是IMEI, 也可以是Mac地址.

8. Mac: WIFI的Mac地址.

9. SecureId: 设备随机生成的第一个引导, 间接获取设备寿命.

10. InstallId: 应用安装时间.

11. MODEL: 设备型号

12. MANUFACTURER: 设备生产工厂.

其中获取DeviceId需要权限: READ_PHONE_STATE; 获取Mac地址需要权限ACCESS_WIFI_STATE.

/**
 * 获取手机标示, 用于激活信息, 需要权限
 * READ_PHONE_STATE和ACCESS_WIFI_STATE
 * <p/>
 * Created by wangchenlong on 15/12/11.
 */
public class ActiveInfo {

    @SuppressWarnings("unused")
    private static final String TAG = "DEBUG-WCL: " + ActiveInfo.class.getSimpleName();

    @SuppressWarnings("all")
    private static final String STAT_INFO_STR =
            "app=%s&platform=android&systemVer=%s&version=%s&app_ver=%s&imei=%s"
                    + "&device_id=%s&mac=%s&secureId=%s&installId=%s&phoneType=%s_by_%s&vendor=";

    private static final String APP_ID = "512";
    private static final String VENDOR = "PedometerLibrary";

    private static final int HTTP_OK = 200; // 请求成功
    private static final int TIME_OUT = 5 * 1000; // 连接超时时间

    private static ActiveInfo sInstance;

    private final Context mContext;
    private final SharedPreferences mPrefs;
    private final TelephonyManager mTelephonyManager;
    private final WifiManager mWifiManager;

    private ActiveInfo() {
        mContext = PedometerManager.getInstance().getContext();
        mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
        mTelephonyManager = (TelephonyManager) mContext
                .getSystemService(Context.TELEPHONY_SERVICE);
        mWifiManager = (WifiManager) (mContext.getSystemService(Context.WIFI_SERVICE));
    }

    public static ActiveInfo getInstance() {
        if (sInstance == null) {
            sInstance = new ActiveInfo();
        }
        return sInstance;
    }

    // 获取签名信息
    private String getPhoneSignature() {
        String signature; // 手机标示
        signature = String.format(STAT_INFO_STR,
                getUrlString(APP_ID), // 应用ID
                getUrlString(android.os.Build.VERSION.RELEASE), // 系统版本
                getUrlString(BuildConfig.VERSION_NAME), // SDK版本
                getUrlString(BuildConfig.VERSION_NAME), // 服务器版本
                getUrlString(getDeviceId()), // IMEI
                getUrlString(getDeviceId()), // 设备ID
                getUrlString(getMac()), // Mac地址
                getUrlString(getSecureId()), // 安全ID
                getUrlString(getInstallId()), // 安装时间
                getUrlString(android.os.Build.MODEL), // 设备型号
                getUrlString(android.os.Build.MANUFACTURER)); // 设备工厂
        signature += VENDOR;

        return signature;
    }

    private String getUrlString(String s) {
        //noinspection deprecation
        return URLEncoder.encode(s);
    }

    // 获取设备ID, 需要权限READ_PHONE_STATE
    private String getDeviceId() {
        if (mPrefs.contains(PrefsConsts.PHONE_INFO_DEVICE_ID_PREFS)) {
            return mPrefs.getString(PrefsConsts.PHONE_INFO_DEVICE_ID_PREFS, "");
        } else {
            mPrefs.edit().putString(
                    PrefsConsts.PHONE_INFO_DEVICE_ID_PREFS,
                    mTelephonyManager.getDeviceId())
                    .apply();
            return mPrefs.getString(PrefsConsts.PHONE_INFO_DEVICE_ID_PREFS, "");
        }
    }

    // 获取Mac地址, 需要权限ACCESS_WIFI_STATE
    private String getMac() {
        if (mPrefs.contains(PrefsConsts.PHONE_INFO_MAC_ADDRESS_PREFS)) {
            return mPrefs.getString(PrefsConsts.PHONE_INFO_MAC_ADDRESS_PREFS, "");
        } else {
            mPrefs.edit().putString(
                    PrefsConsts.PHONE_INFO_MAC_ADDRESS_PREFS,
                    mWifiManager.getConnectionInfo().getMacAddress())
                    .apply();
            return mPrefs.getString(PrefsConsts.PHONE_INFO_MAC_ADDRESS_PREFS, "");
        }
    }

    // 获取安全ID
    private String getSecureId() {
        if (mPrefs.contains(PrefsConsts.PHONE_INFO_SECURE_ID_PREFS)) {
            return mPrefs.getString(PrefsConsts.PHONE_INFO_SECURE_ID_PREFS, "");
        } else {
            mPrefs.edit().putString(
                    PrefsConsts.PHONE_INFO_SECURE_ID_PREFS,
                    Settings.Secure.getString(
                            mContext.getContentResolver(), Settings.Secure.ANDROID_ID))
                    .apply();
            return mPrefs.getString(PrefsConsts.PHONE_INFO_SECURE_ID_PREFS, "");
        }
    }

    // 获取安装时的系统时间
    private String getInstallId() {
        if (mPrefs.contains(PrefsConsts.PHONE_INFO_INSTALL_ID_PREFS)) {
            return mPrefs.getString(PrefsConsts.PHONE_INFO_INSTALL_ID_PREFS, "");
        } else {
            mPrefs.edit().putString(
                    PrefsConsts.PHONE_INFO_INSTALL_ID_PREFS,
                    String.format("%d", System.currentTimeMillis()))
                    .apply();
            return mPrefs.getString(PrefsConsts.PHONE_INFO_INSTALL_ID_PREFS, "");
        }
    }

    // 发送激活信息
    public void postActiveInfo() {
        String path = "http://api.chunyu.me/api/launch_request/?";
        path += getPhoneSignature();
        Log.d(TAG, "url: " + path);
        try {
            URL url = new URL(path);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(TIME_OUT); // 连接超时
            connection.connect();
            if (connection.getResponseCode() == HTTP_OK) {
                Log.d(TAG, " 发送激活信息成功");
            } else {
                Log.e(TAG, " 发送激活信息失败: " + connection.getResponseCode());
            }
            connection.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

为了减少获取代价, 可以存储一些关键值到首选项.

2. 上传

网络请求必须使用异步线程, 我们只是上传激活, 并不关心返回值, 比较简单.

new PostActiveTask().execute(); // 发送激活信息
    // 发送激活任务的线程
    private class PostActiveTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            ActiveInfo.getInstance().postActiveInfo();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
        }
    }

返回均为空值, 在doInBackground中, 需要注明return null.

OK, Enjoy It.

时间: 2024-10-12 19:46:27

发送手机物理标识请求的相关文章

使用“互亿无线”短信验证码接口来实现发送手机验证码功能

今天 突然发神经想到要做一个发送手机验证码的功能,因为看到很多用户注册这个模块都有手机验证这个功能,于是乎,俺就上网查了很多资料,整理了一下,做了一个简单的手机验证码实现功能.不过我用的是试用账号,只可以发送30个短信,如果要更多的话,需要充值,这是我感到很遗憾的事情.下面跟着我来实现这个功能吧,大神勿喷哈. 1.首先,上互亿无线注册一个账号,http://www.ihuyi.com/,注册后你可以看到你的账号参数信息: 2.使用VS创建一个空的Web应用程序: 注册静态页面:index.htm

利用线程创建发送手机验证码的工具类

1.生成验证码类 package com.util; import java.util.Timer; import java.util.TimerTask; /** * @description 手机发送验证码工具类 */ public class MessageCode extends TimerTask{ private Timer timer; /** * @description 短信验证码的内容 */ private String messageCode; /** * @descrip

python 发送post和get请求

摘自:http://blog.163.com/[email protected]/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在apache的cgi-bin目录下:#!/usr/bin/pythonimport cgidef main():     print "Content-type: text/html\n"    form = cgi.FieldStorage()    if form.has_key(&qu

js history对象 手机物理返回键

有兴趣的可以了解下history对象,不感兴趣也可以直接跳到手机物理返回键监听部分 ******************[history对象]有length属性,go()/back()/forward()跳转方法**************************** 我们要了解浏览器的history对象, history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起:history.length属性保存着历史记录的URL数量.初始时,该值为1.如果当前窗口先后访问了三个网址,histo

iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConnection的使用,如有需要了解NSURLConnection如何发送请求. 详细信息,请参考:http://www.cnblogs.com/wendingding/p/3813706.html 3)本文示例代码发送的请求均为http请求,已经对info.plist文件进行配置. 如何配置,请参考:

在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需要获取认证信息(如Cookie),所以返回的是HttpWebResponse对象,有了返回的HttpWebResponse实例,可以获取登录过程中返回的会话信息,也可以获取响应流. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;

Loadrunner接口测试-发送JSON格式的请求

昨天接到了一个测试接口的任务,接口的请求参数和返回结果均是JSON字符串,先是使用了函数web_submit_date,执行时报错,查询资料没找到原因,不知道是不是不支持JSON串,有兴趣的可以自己试下.然后尝试用web_custom_request函数,执行后返回的结果都正确,ok,就它了. web_custom_request("refund",                           //VuGen中树形视图中显示的名称         "Url=http:

php curl 发送get或者post请求

php可以扮演资料的发送者. 简单的get $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://SomeDomain/SamplePath?SomeVar=test"); curl_exec($ch); curl_close($ch); 2.  简单的post $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://SomeDomain/SamplePath

HttpClient发送get,post接口请求

HttpClient发送get post接口请求 /** * post * @param url POST地址 * @param data POST数据NameValuePair[] * @return 响应的参数 */ public static String post(String url,NameValuePair[] data){---------------get里面没有data只有url String response = ""; HttpClient httpClient