2011-01-04 22 views
8

私のアプリはこのスタックトレースを送ってきました。このスタックトレースは、何か非常に間違っているように見えます。sendTextMessageにREAD_PHONE_STATE権限が必要なのはなぜですか?

PHONE_MODEL = SKY IM-A630K、android_version = 2.1アップデート1

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10089 nor current process has android.permission.READ_PHONE_STATE. 

    at android.os.Parcel.readException(Parcel.java:1218) 
    at android.os.Parcel.readException(Parcel.java:1206) 
    at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getLine1Number(IPhoneSubInfo.java:223) 
    at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:764) 
    at android.telephony.SmsManager.sendTextMessage(SmsManager.java:129) 
    at android.telephony.SmsManager.sendTextMessage(SmsManager.java:108) 
    at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:91) 
    at com.emergency.button.EmergencyActivity$EmergencyThread.sendSMS(EmergencyActivity.java:294) 
    at com.emergency.button.EmergencyActivity$EmergencyThread.sendMessages(EmergencyActivity.java:386) 
    at com.emergency.button.EmergencyActivity$EmergencyThread.run(EmergencyActivity.java:266) 

だから、僕はsendTextMessage周りの任意およびすべての例外をキャッチする必要がありますか?誰がこれが間違っている?

答えて

2

私のアプリはこのスタックトレースを送信しました。このスタックトレースは非常に間違っているようです。

これはあなたがこの問題を初めて見たときのことで、他の携帯電話では起こりません。

この電話機モデルのAndroid実装では、SMSメッセージを送信しようとする前にSmsManagerが電話機の状態を確認しようとしている可能性はありますか?それは純粋に推測ですが、SMSマネージャのTelephony APIドキュメントには言及していませんが、それは不合理なことではありません。多分、私は確信していません。

SMSメッセージを送信することはアプリでは非常に重要なので、可能であればmessaeの送信に関連する可能性のある例外をすべてキャッチする必要があります。

この特定の問題は回復できません。なぜなら、READ_PHONE_STATEの使用権限をマニフェストに宣言してみませんか?

+1

私はREAD_PHONE_STATEは私が自分の電話番号を知っているのは嫌だユーザーを追い払うかもしれないと思いました。しかたがない...私はちょうどそれがアプリの生涯全体で一度起こったので、私はちょうどキャッチし、この例外を無視する(私はユーザーに報告する)と思う... – ubershmekel

+2

@ubershmekel:はい、それを避けることができますREAD_PHONE_STATEを使用していない。多分これはちょうど1回限りであり、うまくいけば例外をキャッチすることは助けになるでしょう。 – Squonk

7

Lollipop(API 21)では、SmsManager.getDefault().divideMessage(String)のような良性な機能を使用していても、READ_PHONE_STATE権限が必要です。 Lollipopにアップグレードする前とアップグレードした後で、Nexus 5デバイスでテストしてから、以前は必要ではなく、OSの問題であると確信しています。以前は、KitKatを実行しているときに、SMSはREAD_PHONE_STATEの許可なしで正常に動作しました。その後、それは必要でした。

なぜなら、私は、テレフォニー機能は、すべてのことについて賢明な決定を下そうとしているからです。だから、SMSを分割する(それを送信することさえしない)のような単純なタスクは、SmsManagerのすべての方法で実行され、電話の状態について問い合わせます。

デザインバグだと思います。そしてあなたが上記のように、それは可能であり、ユーザを恐れるはずです。なぜ彼らはAndroid上であまりにも多くのあいまいな権限を持っていますか?

これは楽しみのためだけに、私のスタックトレースです:

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10078 nor current process has android.permission.READ_PHONE_STATE. 
at android.os.Parcel.readException(Parcel.java:1540) 
at android.os.Parcel.readException(Parcel.java:1493) 
at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getGroupIdLevel1(IPhoneSubInfo.java:465) 
at android.telephony.TelephonyManager.getGroupIdLevel1(TelephonyManager.java:1666) 
at android.telephony.SmsMessage.hasEmsSupport(SmsMessage.java:776) 
at com.android.internal.telephony.gsm.SmsMessage.calculateLength(SmsMessage.java:808) 
at android.telephony.SmsMessage.fragmentText(SmsMessage.java:322) 
at android.telephony.SmsManager.divideMessage(SmsManager.java:328) 
at mobi.chatfish.utils.CFCommunications.sendSMSDirect(CFCommunications.java:138) 
+2

うん、私は同様のstacktrace(若干異なる行番号)OnePlus One Loolipopを実行しているのを見ている。 https://code.google.com/p/android/issues/detail?id=81758スターをください:) – Flow

+1

このエラーはY550で発生していますが、私のアプリではマニフェストのパーミッションとしてREAD_PHONE_STATEが宣言されていますか? ?? – LairdPleng

+1

LollipopのREAD_PHONE_STATEを必要とするSmsManager.getDefault()。divideMessage(String)と全く同じ問題があります。それは非常に刺激的です! – goseib

0

私はHTCの携帯電話と同じ問題(728G欲望)デュアルSIMを持っていた私は、「READ_PHONE_STATE」を含める必要がありましたが、今、Googleがあります私はそれをするのが面倒です:)私はいくつかの調査を行い、 "READ_PHONE_STATE"を使わずにより良い方法を見つけました。 問題は、一部のデバイス(主にデュアルsim)が、 "SmsManager.getDefault()"を呼び出すときに起きるデフォルトの "SubscriptionId"を探すための "READ_PHONE_STATE"アクセス権が必要なことです。以下 は、私はすべての例外は、未収場合(1)SubscriptionIdする値を割り当てることによって、この問題を回避するために使用していたコードです:

  SmsManager smsManager = SmsManager.getDefault(); 

      if (android.os.Build.VERSION.SDK_INT >= 22){ 
       Log.e("Alert","Checking SubscriptionId"); 
      try { 
       Log.e("Alert","SubscriptionId is " + smsManager.getSubscriptionId()); 
      } catch (Exception e) { 
       Log.e("Alert",e.getMessage()); 
       Log.e("Alert","Fixed SubscriptionId to 1"); 
       smsManager = SmsManager.getSmsManagerForSubscriptionId(1); 
      } 
      } 

      smsManager.sendTextMessage(mobileNumber, null, msgStr, null, null); 
関連する問題