微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > Android MTK平台 实现用命令写手机IMEI号(转)

Android MTK平台 实现用命令写手机IMEI号(转)

时间:10-02 整理:3721RD 点击:
涉及内容:

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号恢复出厂设置就没了。

很好很强大

学习学习。

学习学习,帮顶

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top