Vinnaren i pepparkakshustävlingen!
2021-07-26, 00:23
  #1
Medlem
miikoss avatar
Hej, försöker läsa data ur inkommande MMS på mobilen. Använder Java (7 eller 8 tror jag)

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.


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.
Citera
2021-07-26, 09:38
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av miikos
Hej, försöker läsa data ur inkommande MMS på mobilen. Använder Java (7 eller 8 tror jag)

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.



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?
Det ser ju ut som om du försöker iterera över något som inte finns i din cursor, eftersom den är tom?

Kollar jag på den SO-länk du la med finner jag följande kodrader:

Kod:
ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"*"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, null, null, null);

uri-n till resursen där är längre än den uri du har i din kod, är det problemet?

Hur långt kommer du egentligen? Har du provat att debugga koden?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback