Einkommende SMS simulieren - PDU

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Einkommende SMS simulieren - PDU

    Hallo zusammen,

    ich möchte eine einkommende SMS simulieren. Hintergrund ist folgender: Mein Auto kann mich bei einkommenden SMS benachrichtigen und diese vorlesen. Meine Idee war nun, bei einkommenden WhatsApp Nachrichten eine SMS zu simulieren, damit ich diese ebenso vorgelesen bekomme.

    Bei meiner Internetrecherche bin ich auf folgenden Ansatz gestoßen:
    roshandawrani.wordpress.com/20…eceiving-from-any-number/

    Ich bekomme folgenden Fehler:
    "Permission Denial: not allowed to send broadcast android.provider.Telephony.SMS_RECEIVED from pid=12740, uid=10080"

    Ich tippe mal irgendwas an meiner Manifest-Datei stimmt nicht...

    Mein Code:
    Spoiler anzeigen

    Java-Quellcode: MainActivity.java

    1. package com.example.whatsms;
    2. import android.content.Context;
    3. import android.content.Intent;
    4. import android.support.v7.app.AppCompatActivity;
    5. import android.os.Bundle;
    6. import android.telephony.PhoneNumberUtils;
    7. import android.telephony.SmsMessage;
    8. import android.util.Log;
    9. import android.view.View;
    10. import android.widget.Button;
    11. import android.widget.Toast;
    12. import java.io.ByteArrayOutputStream;
    13. import java.io.IOException;
    14. import java.lang.reflect.Method;
    15. import java.util.Calendar;
    16. import java.util.GregorianCalendar;
    17. public class MainActivity extends AppCompatActivity {
    18. private static String TAG = "SendSmsActivity";
    19. Button bt;
    20. @Override
    21. protected void onCreate(Bundle savedInstanceState) {
    22. super.onCreate(savedInstanceState);
    23. setContentView(R.layout.activity_main);
    24. Toast.makeText(getBaseContext(), "starting",
    25. Toast.LENGTH_LONG).show();
    26. bt = (Button) findViewById(R.id.button);
    27. bt.setOnClickListener(new View.OnClickListener(){
    28. public void onClick(View view) {
    29. try {
    30. sendSms(getBaseContext(), "09000000000", "hello there!");
    31. Toast.makeText(getBaseContext(), "Sent the test sms", Toast.LENGTH_SHORT).show();
    32. } catch (Exception e) {
    33. Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    34. Log.d(TAG, "Exception : " + e.getClass() + " : " + e.getMessage());
    35. }
    36. }
    37. });
    38. }
    39. private void sendSms(Context context, String sender, String body) throws Exception {
    40. byte[] pdu = null;
    41. byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD("0000000000");
    42. byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(sender);
    43. int lsmcs = scBytes.length;
    44. byte[] dateBytes = new byte[7];
    45. Calendar calendar = new GregorianCalendar();
    46. dateBytes[0] = reverseByte((byte) (calendar.get(Calendar.YEAR)));
    47. dateBytes[1] = reverseByte((byte) (calendar.get(Calendar.MONTH) + 1));
    48. dateBytes[2] = reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH)));
    49. dateBytes[3] = reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY)));
    50. dateBytes[4] = reverseByte((byte) (calendar.get(Calendar.MINUTE)));
    51. dateBytes[5] = reverseByte((byte) (calendar.get(Calendar.SECOND)));
    52. dateBytes[6] = reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) +
    53. calendar.get(Calendar.DST_OFFSET)) / (60 * 1000 * 15)));
    54. ByteArrayOutputStream bo = new ByteArrayOutputStream();
    55. bo.write(lsmcs);
    56. bo.write(scBytes);
    57. bo.write(0x04);
    58. bo.write((byte) sender.length());
    59. bo.write(senderBytes);
    60. bo.write(0x00);
    61. bo.write(0x00);
    62. bo.write(dateBytes);
    63. String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet";
    64. Class cReflectedNFCExtras = Class.forName(sReflectedClassName);
    65. Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod("stringToGsm7BitPacked", new Class[] { String.class });
    66. stringToGsm7BitPacked.setAccessible(true);
    67. byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body);
    68. bo.write(bodybytes);
    69. pdu = bo.toByteArray();
    70. // broadcast the SMS_RECEIVED to registered receivers
    71. broadcastSmsReceived(context, pdu);
    72. // or, directly send the message into the inbox and let the usual SMS handling happen - SMS appearing in Inbox, a notification with sound, etc.
    73. startSmsReceiverService(context, pdu);
    74. }
    75. private void broadcastSmsReceived(Context context, byte[] pdu) {
    76. Intent intent = new Intent();
    77. intent.setAction("android.provider.Telephony.SMS_RECEIVED");
    78. intent.putExtra("pdus", new Object[] { pdu });
    79. context.sendBroadcast(intent);
    80. }
    81. private void startSmsReceiverService(Context context, byte[] pdu) {
    82. Intent intent = new Intent();
    83. intent.setClassName("com.android.mms", "com.android.mms.transaction.SmsReceiverService");
    84. intent.setAction("android.provider.Telephony.SMS_RECEIVED");
    85. intent.putExtra("pdus", new Object[] { pdu });
    86. intent.putExtra("format", "3gpp");
    87. context.startService(intent);
    88. }
    89. private byte reverseByte(byte b) {
    90. return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4);
    91. }
    92. }
    Alles anzeigen


    XML-Quellcode: AndroidManifest.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.example.whatsms">
    4. <uses-permission android:name="android.permission.BROADCAST_SMS" />
    5. <uses-permission android:name="android.permission.RECEIVE_SMS" />
    6. <application
    7. android:allowBackup="true"
    8. android:icon="@mipmap/ic_launcher"
    9. android:label="@string/app_name"
    10. android:roundIcon="@mipmap/ic_launcher_round"
    11. android:supportsRtl="true"
    12. android:theme="@style/AppTheme">
    13. <activity android:name=".MainActivity">
    14. <intent-filter>
    15. <action android:name="android.intent.action.MAIN" />
    16. <category android:name="android.intent.category.LAUNCHER" />
    17. <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    18. </intent-filter>
    19. </activity>
    20. </application>
    21. </manifest>
    Alles anzeigen




    Ich hoffe ihr könnt mir weiter helfen? :)
  • Servus,
    danke für den Tipp. Ich habe den Permission Request für android.permission.RECEIVE_SMS eingebaut.

    [Blockierte Grafik: https://i.ibb.co/649kBCJ/Anmerkung-2019-04-07-113635.jpg]









    Beim ersten Aufruf kommt jetzt auch ein PopUp. Beim senden der SMS habe ich jedoch immer noch die selbe Fehlermeldung wie bisher.
    Habe ich vielleicht die falsche Permission angefragt? Wenn ich das Ganze für android.permission.BROADCAST_SMS versuche wir einfach ein PopUp angezeigt.

    Gruß Mario