Hej, försöker läsa data ur inkommande MMS på mobilen. Använder Java (7 eller 8 tror jag)
Manifest.xml
Denna använder jag för inkommande SMS. Den fungerar.
Denna provar jag för MMS.
Försökte köra efter denna.
https://stackoverflow.com/questions/...ata-in-android
Får detta felmeddelandet.
Har ett interface med en metod.
Och en Activity ( ärvd av AppCompatActivity), där jag kollar om användaren gett permissions och frågar om det i runtime, detta verkar fungera.
Någon som gott något sådant här förut?
Eller som förstår sig på cursor-felet?
Manifest.xml
Kod:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="miikos.app">
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
<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" />
</intent-filter>
</activity>
<receiver
android:name=".SmsReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<receiver
android:name=".MmsReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
</application>
</manifest>
Denna använder jag för inkommande SMS. Den fungerar.
Kod:
public class SmsReceiver extends BroadcastReceiver {
private static miikos.app.Interface smsReader;
@Override
public void onReceive(Context context, Intent intent) {
Bundle data = intent.getExtras();
Object[] pdus = (Object[]) data.get("pdus");
SmsMessage smsMessage;
CharSequence sender = "";
StringBuilder messageBody = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
//smsMessage.
sender = smsMessage.getDisplayOriginatingAddress();
//Check the sender to filter messages which we require to read
messageBody.append(smsMessage.getMessageBody());
}
//Pass the message text to interface
smsReader.smsReceived(sender, messageBody.toString());
}
public static void bindListener(miikos.app.Interface listener) {
smsReader = listener;
}
}
Denna provar jag för MMS.
Kod:
public class MmsReceiver extends BroadcastReceiver {
private static miikos.app.Interface mmsReader;
@Override
public void onReceive(Context context, Intent intent) {
String body = "";
Uri uri = Uri.parse("content://mms/");
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
cursor.moveToNext();
// works
String mms_id = cursor.getString(cursor.
getColumnIndex("_id"));
// Doesn't work
String selectionPart = "mid=" + mms_id;
Uri uriData = Uri.parse("content://mms/part");
Cursor cursorData = context.getContentResolver().query(uri, null,
selectionPart, null, null);
if (cursor.moveToFirst()) {
do {
String partId = cursor.getString(cursor.getColumnIndex("_id"));
String type = cursor.getString(cursor.getColumnIndex("ct"));
if ("text/plain".equals(type)) {
String data = cursor.getString(cursor.getColumnIndex("_data"));
if (data != null) {
// implementation of this method below
Uri partURI = Uri.parse("content://mms/part/" + mms_id);
InputStream is = null;
StringBuilder sb = new StringBuilder();
try {
is = context.getContentResolver().openInputStream(partURI);
if (is != null) {
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String temp = reader.readLine();
while (temp != null) {
sb.append(temp);
temp = reader.readLine();
}
}
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
body = sb.toString();
} else {
body = cursor.getString(cursor.getColumnIndex("text"));
}
}
} while (cursor.moveToNext());
}
mmsReader.smsReceived("1234", body);
}
public static void bindListener(miikos.app.Interface listener) {
mmsReader = listener;
}
}
Försökte köra efter denna.
https://stackoverflow.com/questions/...ata-in-android
Får detta felmeddelandet.
Citat:
java.lang.RuntimeException: Unable to start receiver miikos.app.MmsReceiver: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
java.lang.RuntimeException: Unable to start receiver miikos.app.MmsReceiver: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
Har ett interface med en metod.
Och en Activity ( ärvd av AppCompatActivity), där jag kollar om användaren gett permissions och frågar om det i runtime, detta verkar fungera.
Någon som gott något sådant här förut?
Eller som förstår sig på cursor-felet?
__________________
Senast redigerad av miikos 2021-07-26 kl. 00:30.
Senast redigerad av miikos 2021-07-26 kl. 00:30.