Android MTK平台 实现用命令写手机IMEI号(转)
时间:10-02
整理:3721RD
点击:
涉及内容:
[html] view plaincopy
另需使用platform给Apk签名;
[java] view plaincopy
[java] view plaincopy
[java] view plaincopy
1. 获取Phone对象;
2. AT command;
3.Java正则表达式;
实现思路:从拨号盘输入含有IMEI号的字串,提取字串中的IMEI,通过Intent,将IMEI号传入写IMEI号的Activity。
*************************************************************************************
1. 获取Phone对象;刚开始想在拨号盘的应用中获取Phone对象耗费了很多时间,还是没有搞定,
最后不得不另写一个APK来完成写IMEI号的功能。如有朋友知道如何在任何文件中获取Phone对象,麻烦告知。
关于androidManifest.xml:
[html] view plaincopy
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.wirteimei"
- android:sharedUserId="android.uid.phone" <span style="color:#ff0000;">//必须包含该属性</span>
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-SDK android:minSdkVersion="8" android:targetSdkVersion="15" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity android:name=".MainActivity"
- android:process="com.android.phone" <span style="color:#ff0000;">//必须包含该属性</span>
- android:label="@string/title_activity_main" >
- <intent-fiLTEr>
- <action android:name="android.intent.action.MAIN" />
- <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
- </intent-filter>
- </activity>
- </application>
- </manifest>
另需使用platform给Apk签名;
有了上述条件,下面就是实现写IMEI号的功能了。
2. 写IMEI号a. 获取IMEI号;
通过拨号盘获取输入的Imei号,例如在拨号盘输入一组特定形式的字串,形式如*#123456789012345#6666#,
然后实现对该类型字串的检测,这里使用的是正则表达式;
[java] view plaincopy
- private static final String PATTERN_IMEI_CMD = "^\\*\\#\\d{15}\\#6{4}\\#$";//检测是否是写IMEI号的字串
- private static final String PATTERN_IMEI_VALUE = "\\d{15}";//提取IMEI号
- Pattern pattern = Pattern.compile(PATTERN_IMEI_CMD);
- Matcher matcher = pattern.matcher(input);
- if(matcher.matches()){
- Pattern pn = Pattern.compile(PATTERN_IMEI_VALUE);
- Matcher mc = pn.matcher(matcher.group());
- String imeiString = "";
- while(mc.matches()){
- imeiString = mc.group();
- }
- Log.d(TAG,"_______________imeiString = "+ imeiString);
- if(imeiString == null || imeiString.isEmpty()){
- return false;
- }
- Intent it = new Intent();
- it.setClassName("com.example.writeimei", "com.example.writeimei.MainActivity");
- it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- it.putExtra("IMEI_STRING", imeiString);
- context.startActivity(it);
- }
b.写入IMEI号;
写入IMEI号的Activity,MainActivity.java:
[java] view plaincopy
- package com.example.wirteimei;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import com.android.internal.telephony.Phone;
- import com.android.internal.telephony.PhoneFactory;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnCLIckListener;
- import android.content.Intent;
- import android.os.AsyncResult;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- public class MainActivity extends Activity {
- private static final int EVENT_WRITE_IMEI = 7;
- private static final String TAG = "MainActivity";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.Layout.activity_main);
- Intent intent = getIntent();
- String imeiString = intent.getStringExtra("IMEI_STRING");
- Log.d(TAG,"____imeiString = "+imeiString);
- String[] ImeiString = new String[2];
[java] view plaincopy
- <span style="white-space:pre"> </span>//AT Command
- ImeiString[0] = "AT+EGMR=1,7,\"" + imeiString + "\"";//single SIM card
- Phone phone = PhoneFactory.getDefaultPhone();//获取Phone对象
- phone.invokeOemRilRequestStrings(ImeiString, new WriteImeiHandler().obtainMessage(EVENT_WRITE_IMEI));//发送更新IMEI号AT command
- }
- private String getImeiString(String input){
- Pattern pattern = Pattern.compile("^\\*\\#\\d{15}\\#6{4}\\#$");
- Matcher matcher = pattern.matcher(input);
- while(matcher.matches()){
- Pattern pattern1 = Pattern.compile("\\d{15}");
- Matcher matcher1 = pattern1.matcher(matcher.group());
- while(matcher1.find()){
- return matcher1.group();
- }
- }
- return null;
- }
- class WriteImeiHandler extends Handler{
- BtnClickListener mListener = new BtnClickListener();
- public void handleMessage(Message message){
- AsyncResult ar = (AsyncResult)message.obj;
- switch(message.what){
- case EVENT_WRITE_IMEI:
- if (ar.exception == null) {
- AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
- builder.setTitle("IMEI WRITE");
- builder.setMessage("The IMEI is writen successfully.");
- builder.setPositiveButton("OK" , mListener);
- builder.setCancelable(false);
- builder.create().show();
- } else {
- AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
- builder.setTitle("IMEI WRITE");
- builder.setMessage("Fail to write IMEI due to radio unavailable or something else.");
- builder.setPositiveButton("OK" , mListener);
- builder.setCancelable(false);
- builder.create().show();
- }
- }
- }
- }
- class BtnClickListener implements DialogInterface.OnClickListener{
- public void onClick(DialogInterface dialog, int which){
- MainActivity.this.finish();
- }
- }
- }
实现复杂了点,既然要平台签名还不如用broadcast传到phone的apk中处理,还需要最后一位的校验。不过这个写入imei号恢复出厂设置就没了。
很好很强大
学习学习。
学习学习,帮顶