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:
https://roshandawrani.wordpres…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:
Java: MainActivity.java
package com.example.whatsms;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneNumberUtils;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class MainActivity extends AppCompatActivity {
private static String TAG = "SendSmsActivity";
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(getBaseContext(), "starting",
Toast.LENGTH_LONG).show();
bt = (Button) findViewById(R.id.button);
bt.setOnClickListener(new View.OnClickListener(){
public void onClick(View view) {
try {
sendSms(getBaseContext(), "09000000000", "hello there!");
Toast.makeText(getBaseContext(), "Sent the test sms", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
Log.d(TAG, "Exception : " + e.getClass() + " : " + e.getMessage());
}
}
});
}
private void sendSms(Context context, String sender, String body) throws Exception {
byte[] pdu = null;
byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD("0000000000");
byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(sender);
int lsmcs = scBytes.length;
byte[] dateBytes = new byte[7];
Calendar calendar = new GregorianCalendar();
dateBytes[0] = reverseByte((byte) (calendar.get(Calendar.YEAR)));
dateBytes[1] = reverseByte((byte) (calendar.get(Calendar.MONTH) + 1));
dateBytes[2] = reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH)));
dateBytes[3] = reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY)));
dateBytes[4] = reverseByte((byte) (calendar.get(Calendar.MINUTE)));
dateBytes[5] = reverseByte((byte) (calendar.get(Calendar.SECOND)));
dateBytes[6] = reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) +
calendar.get(Calendar.DST_OFFSET)) / (60 * 1000 * 15)));
ByteArrayOutputStream bo = new ByteArrayOutputStream();
bo.write(lsmcs);
bo.write(scBytes);
bo.write(0x04);
bo.write((byte) sender.length());
bo.write(senderBytes);
bo.write(0x00);
bo.write(0x00);
bo.write(dateBytes);
String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet";
Class cReflectedNFCExtras = Class.forName(sReflectedClassName);
Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod("stringToGsm7BitPacked", new Class[] { String.class });
stringToGsm7BitPacked.setAccessible(true);
byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body);
bo.write(bodybytes);
pdu = bo.toByteArray();
// broadcast the SMS_RECEIVED to registered receivers
broadcastSmsReceived(context, pdu);
// or, directly send the message into the inbox and let the usual SMS handling happen - SMS appearing in Inbox, a notification with sound, etc.
startSmsReceiverService(context, pdu);
}
private void broadcastSmsReceived(Context context, byte[] pdu) {
Intent intent = new Intent();
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
intent.putExtra("pdus", new Object[] { pdu });
context.sendBroadcast(intent);
}
private void startSmsReceiverService(Context context, byte[] pdu) {
Intent intent = new Intent();
intent.setClassName("com.android.mms", "com.android.mms.transaction.SmsReceiverService");
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
intent.putExtra("pdus", new Object[] { pdu });
intent.putExtra("format", "3gpp");
context.startService(intent);
}
private byte reverseByte(byte b) {
return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4);
}
}
Alles anzeigen
XML: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.whatsms">
<uses-permission android:name="android.permission.BROADCAST_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</activity>
</application>
</manifest>
Alles anzeigen
Ich hoffe ihr könnt mir weiter helfen?