3

Spreadtrum チップセット スマートフォン用の Android アプリケーションを開発しようとしています。このアプリは、SMS を送信したり電話をかけたりするために、どの SIM カード (sim1 または sim2) を指定する必要があります。

Mediatek API hereの API を見つけることができました。これは、Android Studio のアドオンとして機能します。

この投稿で述べたように、adb shell を使用しようとしました。これは機能しませんでした。両方のコマンドが sim1 を介して SMS を送信しました。2 つのコマンド:

1. service call isms 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText" 2. service call isms2 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText"

サービス呼び出しをリストすると、telephony.registry0 と telephony.registry1 があります。

この投稿で述べたように、リフレクションを使用しようとしました。SMSはsim1からのみ送信されました。

スプレッドトラムに使用する API やアドオンはありませんか

注: これは Lollipop およびそれ以降のバージョンの Android では問題にならないことはわかっています。しかし、キットカット バージョン用にこのアプリケーションをビルドしようとしています。

PSチップセット会社に連絡してみました。しかし、残念ながら無反応。

4

1 に答える 1

1

これにはリフレクションを使用する必要があります。次のコードは私のために働いた:

public class SimUtil {

public static boolean sendSMS(Context ctx, int simID, String toNum, String centerNum, String smsText, PendingIntent sentIntent, PendingIntent deliveryIntent) {
String name;

try {
    if (simID == 0) {
        name = "isms0";
    } else if (simID == 1) {
        name = "isms1";
    } else {
        throw new Exception("can not get service which for sim '" + simID + "', only 0,1 accepted as values");
    }

    try
    {
        Method method = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Class[]{String.class});
        method.setAccessible(true);
        Object param = method.invoke(null, new Object[]{name});
        if (param == null)
        {
            throw new RuntimeException("can not get service which is named '" + name + "'");
        }
        method = Class.forName("com.android.internal.telephony.ISms$Stub").getDeclaredMethod("asInterface", new Class[]{IBinder.class});
        method.setAccessible(true);
        Object stubObj = method.invoke(null, new Object[]{param});
        method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class);
        method.invoke(stubObj, ctx.getPackageName(), toNum, centerNum, smsText, sentIntent, deliveryIntent);
    } catch (ClassNotFoundException e)
    {
        throw new RuntimeException(e);
    } catch (NoSuchMethodException e)
    {
        throw new RuntimeException(e);
    } catch (InvocationTargetException e)
    {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e)
    {
        throw new RuntimeException(e);
    }

    return true;
} catch (ClassNotFoundException e) {
    Log.e("Exception", "ClassNotFoundException:" + e.getMessage());
} catch (NoSuchMethodException e) {
    Log.e("Exception", "NoSuchMethodException:" + e.getMessage());
} catch (InvocationTargetException e) {
    Log.e("Exception", "InvocationTargetException:" + e.getMessage());
} catch (IllegalAccessException e) {
    Log.e("Exception", "IllegalAccessException:" + e.getMessage());
} catch (Exception e) {
    Log.e("Exception", "Exception:" + e);
}
return false;
}
}

あなたのシムスロットがどのイズム値を持っているかを判断するには、このコメントをご覧ください。

詳細については、この投稿を参照してください。

于 2016-03-26T12:59:58.527 に答える