博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
发送手机物理标识请求
阅读量:6342 次
发布时间:2019-06-22

本文共 6275 字,大约阅读时间需要 20 分钟。

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

Android

1. 获取

激活信息主要包括:

1. AppId: 公司拥有多款应用, 标示本应用的类型.
2. Platform: 平台Android或者iOS.
3. SystemVersion: 在Android中, 代表Android版本号号.
4. Version: 本应用的版本号.
5. AppVersion: 本应用的server接口版本号.
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 * 

* 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), // server版本号 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
{
@Override protected Void doInBackground(Void... params) { ActiveInfo.getInstance().postActiveInfo(); return null; } @Override protected void onPostExecute(Void result) { } }

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

OK, Enjoy It.

你可能感兴趣的文章
python网络编程学习笔记(7):HTML和XHTML解析(HTMLParser、BeautifulSoup)
查看>>
ctf.360.cn第二届,逆向部分writeup——第二题
查看>>
Windows Server 2012 将资源发布到 AD DS
查看>>
Redhat linux C 函数 以及一些shell命令的 man rpm
查看>>
XenServer 6.0发布
查看>>
提高工作效率的方法之“20分钟理论”
查看>>
docker CE&&EE版本centos安装
查看>>
浅谈URL生成方式的演变
查看>>
Linux下ssl+http 实现 HTTPS 访问服务器设置
查看>>
磁盘与文件系统管理之五
查看>>
python学习-递归
查看>>
day:35:netfilter防火墙的管理工具firewalld及iptables备份恢复
查看>>
第六讲:用户界面 View(二)
查看>>
lsof用户及恢复日志文件
查看>>
Python之获取系统信息--(二)
查看>>
IE9,IE10不能显示@font-face定义的字体
查看>>
JSP----ISPI
查看>>
oracle 归档日志满了如何处理
查看>>
虚函数
查看>>
jsp当中引入静态文件
查看>>