2015-10-26 103 views
1

我最近更新了我的應用程序以支持android 6棉花糖。 我遵循https://developer.android.com/training/permissions/requesting.html的說明android棉花糖 - SMS_RECEIVED權限

併爲Manifest.permission.RECEIVE_SMS添加了requestPermissions。 當IM下執行如下代碼:

 Log.i(TAG, "sending SMS..."); 
     Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
     intent.putExtra("pdus", data); 

     getContext().sendOrderedBroadcast(intent, null); 

我得到

java.lang.SecurityException異常:權限拒絕:不允許從PID = 1999發送廣播android.provider.Telephony.SMS_RECEIVED,UID = 10056

即使我授予SMS_RECEIVED權限,我不能在設備上發送短消息廣播。

任何想法,爲什麼我得到在Android 6.

我的目標這個安全例外是在我的設備鏈接[can I send "SMS received intent"? 生成假的短信。我沒有發現任何提及谷歌,它不再允許。

+0

if(ContextCompat.checkSelfPermission(activity,Manifest.permission。RECEIVE_SMS)== PackageManager.PERMISSION_GRANTED) – Nepster

+0

嘗試這可能是工作http://stackoverflow.com/a/41221852/5488468 –

回答

0

Android 6.0/SDK 23引入了一種請求權限的新方法。

您需要請求短信的權限,請參閱下面的如何處理權限的鏈接:

https://developer.android.com/training/permissions/index.html

+0

正如我所說我遵循指示,並添加了SMS_RECEIVED權限。我得到「不允許發送廣播android.provider.Telephony.SMS_RECEIVED」 – Jonny

+0

添加或請求?兩個不同的東西。添加清單權限不起作用 – AndroidEnthusiast

+0

定期的SDK應用程序無法擁有發送「SMS_RECEIVED」廣播所需的權限。它可以成功請求的任何SMS權限在此無濟於事。 –

2

Android的6運行許可android.provider.Telephony.SMS_RECEIVED給你權限收到該消息發送時由系統SMS提供商提供。

但是,您正試圖自己廣播該消息。我不確定這是否被允許,並且您發現不受相同權限的控制。 (事實上​​,我假設它已被鎖定在棉花糖上,以便只有系統能夠通知收到的短信消息的應用程序)。

+0

我的目標是在我的設備中生成一個假的短信http://stackoverflow.com/questions/12489716/can-i-send-sms-received-intent。我沒有發現任何提及谷歌,它不再允許。你有另一個sugest如何我可以在我的應用程序中生成一個假的短信? – Jonny

0

安裝後,您必須將SMS權限授予您的應用程序。只需進入 設置>應用程序> Your_app>權限 然後授予所需的權限。

+0

常規SDK應用程序無法擁有發送「SMS_RECEIVED」廣播所需的權限。在應用程序設置中啓用SMS權限將無濟於事。 –

0

您需要的API級23+許可,谷歌修改了許可制度,因此該應用的用戶可以授予和安裝應用程式後撤消權限

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;  

    if(Build.VERSION.SDK_INT < 23){ 
    //your code here 
    }else { 
    requestContactPermission(); 
    } 

private void requestContactPermission() { 

    int hasContactPermission =ActivityCompat.checkSelfPermission(context,Manifest.permission.RECEIVE_SMS); 

    if(hasContactPermission != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(Context, new String[] {Manifest.permission.RECEIVE_SMS}, PERMISSION_REQUEST_CODE); 
    }else { 
    //Toast.makeText(AddContactsActivity.this, "Contact Permission is already granted", Toast.LENGTH_LONG).show(); 
    } 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, String[]   permissions, int[] grantResults) { 
switch (requestCode) { 
    case REQUEST_CODE_ASK_PERMISSIONS: 
     // Check if the only required permission has been granted 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      Log.i("Permission", "Contact permission has now been granted. Showing result."); 
      Toast.makeText(this,"Contact Permission is Granted",Toast.LENGTH_SHORT).show(); 
     } else { 
      Log.i("Permission", "Contact permission was NOT granted."); 
     } 
     break; 
    } 
} 
+0

可否請您添加一些解釋? – slfan

+0

RejoylinLokeshwaran有沒有這樣的許可「Manifest.permission.SMS_RECEIVED」 – Jonny

+0

對不起,它是Manifest.permission.RECEIVE_SMS – RejoylinLokeshwaran

6

你需要允許添加到清單XML:

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 

AND,您需要在運行時詢問權限。在android 6之前,權限是在安裝時自動授予的。在Android 6及以上版本中,您可以安裝應用程序並且不授予權限。您可以在活動課使用此功能:

private void requestSmsPermission() { 
    String permission = Manifest.permission.RECEIVE_SMS; 
    int grant = ContextCompat.checkSelfPermission(this, permission); 
    if (grant != PackageManager.PERMISSION_GRANTED) { 
     String[] permission_list = new String[1]; 
     permission_list[0] = permission; 
     ActivityCompat.requestPermissions(this, permission_list, 1); 
    } 
} 

- 你的活動。

+0

OP並不是真的試圖在這裏接收消息。他們試圖發送一個'SMS_RECEIVED'廣播來僞造傳入消息。 'RECEIVE_SMS'權限在這裏沒有幫助。 –