2017-04-17 11 views
0

これを行うにはcodeがいくつか見つかりましたが、例外が発生しました(nullオブジェクト参照で仮想メソッド 'java.lang.Class java.lang.Object.getClass()'を呼び出そうとしています)。私はMoto G 3 Genでテストしています。コードは以下のとおりです。何かが見つからない、または他の方法がある場合は教えてください。ありがとうございました。Android:デュアルSIM携帯電話で特定のSIMでSMSを送信するにはどうすればいいですか?

import android.app.PendingIntent; 
import android.content.Context; 
import android.os.IBinder; 
import android.util.Log; 

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 


public class SimUtil { 

    private static final String TAG = "SimUtil"; 

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

     SimUtil cls = new SimUtil(); 

     String name; 

     try { 
      if (simID == 0) { 
       name = "isms"; 

      } else if (simID == 1) { 
       name = "isms2"; 

      } 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}); 

       if (stubObj == null) 
       { 
        throw new RuntimeException("can not get telephony which is named '" + name + "'"); 
       } 


       method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class); 

       method.invoke(null, new Object[]{ctx.getPackageName(), toNum, null, 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; 
    } 
+0

final ArrayList<Integer> simCardList = new ArrayList<>(); SubscriptionManager subscriptionManager; subscriptionManager = SubscriptionManager.from(activity); final List<SubscriptionInfo> subscriptionInfoList = subscriptionManager .getActiveSubscriptionInfoList(); for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) { int subscriptionId = subscriptionInfo.getSubscriptionId(); simCardList.add(subscriptionId); } 

は最後に次のコードを使用してSMSを送信します。 https://developer.android.com/about/versions/android-5.1.html – shr3jn

+0

@ shr3jn私に例を教えてもらえますか? –

+0

私はあなたの質問に答えました。 – shr3jn

答えて

0

API 22以上をターゲティングしている場合は、次のコードを使用して、SIMカードのリストを取得できます。また、ユーザーがSIMカードを選択できるようにすることができます:あなたは、Android API 22以降をターゲットにしている場合、AndroidはデュアルSIMのデバイスをサポートしてい

int smsToSendFrom = simCardList.get(0); //assign your desired sim to send sms, or user selected choice 
SmsManager.getSmsManagerForSubscriptionId(smsToSendFrom) 
          .sendTextMessage(phoneNumber, null, msg, sentPI, deliveredPI); //use your phone number, message and pending intents 
関連する問題