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

本文介绍了一种在Android设备上手动写入IMEI的方法,包括通过拨号盘输入特定字符串来触发IMEI写入流程,并详细展示了如何利用Java正则表达式提取IMEI号,以及如何使用Phone对象和AT命令完成IMEI号的写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

涉及内容:

1. 获取Phone对象;

2. AT command;

3.Java正则表达式;

实现思路:

从拨号盘输入含有IMEI号的字串,提取字串中的IMEI,通过Intent,将IMEI号传入写IMEI号的Activity。

*************************************************************************************

1. 获取Phone对象;

刚开始想在拨号盘的应用中获取Phone对象耗费了很多时间,还是没有搞定,

最后不得不另写一个APK来完成写IMEI号的功能。如有朋友知道如何在任何文件中获取Phone对象,麻烦告知。


关于AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wirteimei"
	android:sharedUserId="android.uid.phone" //必须包含该属性
    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" //必须包含该属性

            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#,

然后实现对该类型字串的检测,这里使用的是正则表达式;

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:

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];
	//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();
    	}
    }
    
}





<think>好的,我现在需要帮助用户找到在MTK Android平台的BP侧IMEI1、IMEI2和IMEISV的指令。首先,我需要理解用户的问题。用户提到BP侧,这可能指的是基带处理器(Baseband Processor)部分的操作,通常涉及使用AT指令或者特定的工具来IMEI信息。 根据用户提供的引用内容,IMEI的结构和生成方式已经有所了解,特别是CD位是通过Luhn算法计算得出的,而IMEISV的高14位与IMEI相关[^3]。接下来,我需要考虑MTK平台常用的方法。通常,IMEI可能需要使用工程模式工具或者特定的AT指令。 我记得MTK平台常用的是Mobile Meta工具,这是一个工程模式下的工具,用于进行基带相关的配置。用户可能需要使用这个工具,通过USB连接设备,进入Meta模式,然后执行相应的命令IMEI。另外,AT指令也可能被使用,比如AT+EGMR命令。但需要确认具体的指令格式和参数。 需要注意的是,修改IMEI可能涉及法律问题,因为IMEI是设备的唯一标识符,擅自修改可能违法。因此,在回答时需要提醒用户这一点,确保操作合法。 另外,用户提到的IMEI1和IMEI2对应双卡设备的两个IMEIIMEISV则包含软件版本信息。入时可能需要分别处理每个IMEI,并确保CD校验位的正确性,可能需要先计算Luhn校验码。 现在需要验证这些信息是否正确。根据以往的知识,MTK平台确实使用Mobile Meta工具,而AT指令如AT+EGMR用于读IMEI。例如,AT+EGMR=1,7,"IMEI_STRING"用于IMEI。不过不同的平台版本可能有差异,需要确认具体的参数。 总结步骤应该是:进入Meta模式,使用对应的工具或AT指令IMEI1、IMEI2和IMEISV,确保校验正确,并遵守法律规定。</think>在MTK Android平台的BP侧IMEI1、IMEI2和IMEISV通常需要以下步骤: ### 1. **使用工程模式工具(Mobile Meta)** MTK平台常用`Mobile Meta`工具进行基带处理器(BP)的IMEI入操作: - **连接设备**:通过USB进入Meta模式(需开启工程模式权限)。 - **选择IMEI入模块**:在工具界面选择`Connectivity`或`Baseband`相关模块。 - **入指令**: - IMEI1:`AT+EGMR=1,7,"IMEI1_STRING"` - IMEI2:`AT+EGMR=1,10,"IMEI2_STRING"` - IMEISV:需确保格式为15位IMEI+2位SVN(如`12345678901234567`),可能使用类似`AT+EGMR=1,11,"IMEISV_STRING"`的指令[^3]。 ### 2. **通过ADB发送AT指令** 若设备已Root,可通过ADB直接发送AT指令: ```bash adb shell "echo 'AT+EGMR=1,7,\"IMEI1\"' > /dev/radio/pttycmd1" adb shell "echo 'AT+EGMR=1,10,\"IMEI2\"' > /dev/radio/pttycmd1" ``` 需替换`IMEI1`和`IMEI2`为有效值,并验证设备节点路径(如`/dev/radio/pttycmd1`可能因平台版本不同而变化)。 ### 3. **注意事项** - **合法性**:修改IMEI需遵守当地法律法规,仅限合法用途[^1]。 - **校验位计算**:IMEI的第15位(CD)需通过Luhn算法生成,确保入值有效。 - **平台差异**:MTK芯片组不同(如MT6765/MT6877),指令或参数可能略有调整,建议参考对应平台的《ATE工具手册》。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值