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.