您的位置:首页 > 移动开发 > Android开发

android平台短信中心号获取

2012-05-10 21:17 295 查看
就是直接获取用户手机中的短信中心号,该种方式需要你的应用满足两个条件,1:你的应用需要有系统签名. 2:你的应用需要和phone进程在同一个进程组。具体实现方式如下:
配置AndroidManifest.xml 文件
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.hello"

android:sharedUserId="android.uid.phone"

android:versionCode="1"

android:versionName="100">
<application android:icon="@drawable/icon"

android:process="com.android.phone"

android:label="@string/app_name">

<activity android:name=".HelloWordActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>
</application>
</manifest>

具体实现代码如下:
public class HelloWordActivity extends Activity implements Callback

{
private Handler mSmscHandle = null;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);
try

{

mSmscHandle = new Handler(this);

getSmsc();
}
catch(Exception e)
{}
}

@SuppressWarnings("unchecked")

public void getSmsc()

{

try

{

//调用PhoneFactory.getDefaultPhone()

Class PhoneFactory = Class.forName("com.android.internal.telephony.PhoneFactory");

Method getDefaultPhone = PhoneFactory.getMethod("getDefaultPhone", (Class[]) null);

Object phone = (Object)getDefaultPhone.invoke(null, (Object[]) null);

Log.i("HELLOWORLD", "phone:" + phone);

//调用Phone.getSmscAddress(Message result)

Class[] ParamType = new Class[1];

ParamType[0] = Message.class;

Message msg = mSmscHandle.obtainMessage(10001);

Object[] paramValue = new Object[1];

paramValue[0] = msg;

Class Phone = Class.forName("com.android.internal.telephony.Phone");

Method getSmscAddress = Phone.getDeclaredMethod("getSmscAddress", ParamType);

getSmscAddress.invoke(phone, paramValue);

}

catch( Exception e )

{

showTrace(e);

}

}

public boolean handleMessage(Message msg)

{

// TODO Auto-generated method stub

Log.i("HELLOWORLD", "handleMessage() msg.what:" + msg.what

+ " data:" + msg.peekData()

+ " result:" + msg.obj.toString());

if(10001 == msg.what)

{

dealSmscResult(msg.obj);

}

return false;

}

private void dealSmscResult(Object asyncResult)

{

try

{

Field exception = asyncResult.getClass().getDeclaredField("exception");

Throwable throwable = (Throwable)exception.get(asyncResult);

Field result = asyncResult.getClass().getDeclaredField("result");

Object myResult = result.get(asyncResult);

if(null != myResult)

{

Log.i("HELLOWORLD", "dealSmscResult() result:" + myResult.toString());

String szResult = (String)myResult;

String szAddr = szResult.split(",")[0];

Log.i("HELLOWORLD", "dealSmscResult() smsc:" + szAddr);

}

if(null != throwable)

{

Log.i("HELLOWORLD", "dealSmscResult() throwable:" + throwable.getMessage());

}

}

catch(Exception e)

{

showTrace(e);

}

}
}

代码比较简单,就是调用两个两个隐藏的com.android.internal.telephony.PhoneFactory,
om.android.internal.telephony.Phone 就能获取本机的短信中心号码。
之后还需要使用android源码包中 platform.pk8 platform.x509.pem 两个文件(build\target\product\security 目录下)对生成的apk签名;否则无法安装在手机上。签名的命令为
java -jar signapk.jar platform.x509.pem platform.pk8 HelloWord.apk HelloWordSign.apk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: