例として、1 つの特定の API、TelephonyManager.getDeviceId を使用します。実装したいのは、TelephonyManager.getDeviceId をバイパスすることですが、デバイスの imi を取得することです。私はJavaとAndroidが初めてです。AndroidバインダーでのJavaリフレクションは、本当に頭痛の種です...
TelephonyManager のソース コードを調べたところ、IPhoneSubinfo を介して機能していることがわかりました。TelephonyManager ソース コード
たとえば、getDeviceId の場合、TelephonyManager のコードはほとんど
{return getSubscriberInfo().getDeviceId();}
getSubscriberInfo はほとんど (実際にはバインダー プロキシを返します。)
{return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));}
これが私がやろうとしていることです:
step1、TelephonyManager インスタンスを取得します。
ステップ 2、リフレクションを使用して TelephonyManger のプライベート メソッド getSubscriberInfo を取得し、アクセス可能に設定してから、このメソッドを呼び出して IPoneSubInfo インスタンスを取得します。
ステップ 3、リフレクションを使用して IPhoneSubInfo のパブリック メソッド getDeviceId を取得し、このメソッドを呼び出して deviceid を取得します。
この間、TelephonyManager の getDeviceId は呼び出されません。それが私がやりたいことです。しかし、ステップ 3 で、IphoneSubInfo の getDeviceId から返された deviceid が null であり、null.toString() が例外を発生させます。
なにが問題ですか?このトピックに関するドキュメントやブログ投稿があれば歓迎します。
すべてのコードがここにあり、コードがすべてを教えてくれます:
TelephonyManager tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try {
Method TelephonyManager_private_getSubscriberInfo = tel.getClass().getDeclaredMethod("getSubscriberInfo");
TelephonyManager_private_getSubscriberInfo.setAccessible(true);
Object iphonesubinfo = TelephonyManager_private_getSubscriberInfo.invoke(tel);
log(iphonesubinfo.toString());
Method getDeviceId = iphonesubinfo.getClass().getDeclaredMethod("getDeviceId");
log(getDeviceId.toString());
getDeviceId.setAccessible(true);
Object deviceid = getDeviceId.invoke(iphonesubinfo); // why di is null :(
log("deviceid:" + deviceid.toString());
}catch (NoSuchMethodException e){
log("TelephonyManager_private_getSubscriberInfo noSuchMethodException");
e.printStackTrace();
}catch (IllegalAccessException e){
log("TelephonyManager_private_getSubscriberInfo IllegalAccessException");
e.printStackTrace();
}catch (InvocationTargetException e){
log("TelephonyManager_private_getSubscriberInfo InvocationTargetException");
e.printStackTrace();
}