Здравствуйте, требуется помощь профессионала, так как эта задача чрезвычайно сложна.
Пытаюсь создать экземпляр класса com.android.internal.telephony.RIL. Закрытый API я добавил и все сделал правильно - фреймворк модема пропустил через dex2jar и добавил в используемые классы. Также открыл jar в jd-gui. Кстати, скорее всего фреймворк был модифицирован производетелем - Micromax. Вызвал статический метод TelephonyDevController.getModemCount() и получил возвращаемое значение - все работает. Вообще задача следующая:
Существует интерфейс com.android.internal.telephony.IccCard с методом boolean getIccLockEnabled(). Существует класс, его реализующий - com.android.internal.telephony.uicc.IccCardProxy. Я хочу вызвать его метод getIccLockEnabled. Чтобы создать экземпляр этого классa, в его конструктор требуется передать параметры android.content.Context, com.android.internal.telephony.CommandsInterface и int. Второй параметр является интерфейсом, а значит можно передать его сабкласс, а именно, com.android.internal.telephony.RIL. Чтобы создать экземпляр RIL, в его конструктор требуется передать контекст и два int. Но вот при создании RIL-а приложение вылетает с логом TelephonyDevController not yet created!?!.
Вот конструктор классa RIL
public RIL(Context paramContext, int paramInt1, int paramInt2, Integer paramInteger)
{
super(paramContext);
riljLog("RIL(context, preferredNetworkType=" + paramInt1 + " cdmaSubscription=" + paramInt2 + ")");
this.mContext = paramContext;
this.mCdmaSubscription = paramInt2;
this.mPreferredNetworkType = paramInt1;
this.mPhoneType = 0;
this.mInstanceId = paramInteger;
this.mWakeLock = ((PowerManager)paramContext.getSystemService("power")).newWakeLock(1, "RILJ");
this.mWakeLock.setReferenceCounted(false);
this.mWakeLockTimeout = SystemProperties.getInt("ro.ril.wake_lock_timeout", 60000);
this.mWakeLockCount = 0;
this.mSenderThread = new HandlerThread("RILSender" + this.mInstanceId);
this.mSenderThread.start();
this.mSender = new RILSender(this.mSenderThread.getLooper());
if (!((ConnectivityManager)paramContext.getSystemService("connectivity")).isNetworkSupported(0)) {
riljLog("Not starting RILReceiver: wifi-only");
}
for (;;)
{
TelephonyDevController.getInstance();
TelephonyDevController.registerRIL(this);
return;
riljLog("Starting RILReceiver" + this.mInstanceId);
this.mReceiver = createRILReceiver();
this.mReceiverThread = new Thread(this.mReceiver, "RILReceiver" + this.mInstanceId);
this.mReceiverThread.start();
paramContext = (DisplayManager)paramContext.getSystemService("display");
this.mDefaultDisplay = paramContext.getDisplay(0);
paramContext.registerDisplayListener(this.mDisplayListener, null);
}
}
И методы класса TelephonyDevController - create() и getInstance()
public static TelephonyDevController create()
{
synchronized (mLock)
{
if (sTelephonyDevController != null) {
throw new RuntimeException("TelephonyDevController already created!?!");
}
}
sTelephonyDevController = new TelephonyDevController();
TelephonyDevController localTelephonyDevController = sTelephonyDevController;
return localTelephonyDevController;
}
public static TelephonyDevController getInstance()
{
synchronized (mLock)
{
if (sTelephonyDevController == null) {
throw new RuntimeException("TelephonyDevController not yet created!?!");
}
}
TelephonyDevController localTelephonyDevController = sTelephonyDevController;
return localTelephonyDevController;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей