Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用contentObserver和contentResolver从消息中读取已发送短信的内容?_Android_Android Studio_Sms_Android Contentresolver - Fatal编程技术网

Android 如何使用contentObserver和contentResolver从消息中读取已发送短信的内容?

Android 如何使用contentObserver和contentResolver从消息中读取已发送短信的内容?,android,android-studio,sms,android-contentresolver,Android,Android Studio,Sms,Android Contentresolver,我想从手机短信中读取发送的短信内容。我不是在开发发送短信阅读应用程序,而是想从手机内置短信应用程序中阅读最近发送的短信内容。 我想从已发送的邮件中读取已发送的短信,并根据邮件中的关键字发送一些通知 我知道我们必须扩展ContentObserver类并使用ContentResolver 任何想法都值得赞赏。谢谢大家! 这是我的观察者类SMSObserver.java 公共类SMSObserver扩展ContentObserver{ private String lastSmsId; private

我想从手机短信中读取发送的短信内容。我不是在开发发送短信阅读应用程序,而是想从手机内置短信应用程序中阅读最近发送的短信内容。 我想从已发送的邮件中读取已发送的短信,并根据邮件中的关键字发送一些通知

我知道我们必须扩展ContentObserver类并使用ContentResolver

任何想法都值得赞赏。谢谢大家!

这是我的观察者类SMSObserver.java

公共类SMSObserver扩展ContentObserver{

private String lastSmsId;
private Context c;
private String phoneNumber;
int type;
String lastID;

public SMSObserver(Handler handler) {
    super(handler);
}

@Override
public void onChange(boolean selfChange,Uri uri) {
    super.onChange(selfChange);
    Uri uriSMSURI = Uri.parse("content://sms/out");
    Cursor cur = c.getContentResolver().query(uriSMSURI, null, null, null, "date DESC LIMIT 1");
    cur.moveToNext();
    //String id = cur.getString(cur.getColumnIndex("_id"));
    if( (type == 2 || type == 1) && (!lastID.contentEquals(cur.getString(cur.getColumnIndex("_id")))) ) {
        String protocol = cur.getString(cur.getColumnIndex("protocol"));
        lastID = cur.getString(cur.getColumnIndex("_id"));
        // Message sent
        if (protocol == null) {
            Log.i("SMSStatus", "SMS Sent");
        }
        // Message receive
        else {
            Log.i("SMSStatus", "SMS received");
        }

        if (smsChecker(lastID)) {
            String address = cur.getString(cur.getColumnIndex("address"));
            // Optional: Check for a specific sender
            if (address.equals(phoneNumber)) {
                String message = cur.getString(cur.getColumnIndex("body"));
                // Use message content for desired functionality
                if(message.contains("Dinner")){
                    Toast.makeText(c,"Dinner offer for 2!!",Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}

// Prevent duplicate results without overlooking legitimate duplicates
public boolean smsChecker(String smsId) {
    boolean flagSMS = true;

    if (smsId.equals(lastSmsId)) {
        flagSMS = false;
    }
    else {
        lastSmsId = smsId;
    }

    Log.d(lastSmsId ,"LastSmsId");
    return flagSMS;
}
}

我正在类SentSMSTrackerService.java中注册contentObserver

公共类SentSMSTrackerService扩展服务{

@Override
public int onStartCommand(Intent intent, int flag, int startId) {
    SMSObserver smsObserver = new SMSObserver(new Handler());
    ContentResolver contentResolver = getApplicationContext().getContentResolver();
    contentResolver.registerContentObserver(Uri.parse("content://sms/out"), true, smsObserver);
    return START_STICKY;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
}

我还在AndroidManifest.xml中授予权限


但是,我还是看不清发送的短信。

你有什么问题?您描述了您的想法以及如何尝试解决它,现在编写代码。所以社区不会为你这样做;)使用广播实现这一点我不确定其余的设置,但首先,没有
content://sms/out
URI。有一个
content://sms/outbox
,但这是挂起的消息。您可能需要
content://sms/sent
。其次,您不能在
content://sms/sent
。它必须是
content://sms
。别问我他们为什么那样做,但事实就是这样。您仍然可以查询
content://sms/sent
很好,但这会让跟踪最近发送的消息变得更加复杂,因为您的观察者基本上会对
sms
表进行任何更改,无论它是发送的消息还是其他信息。我尝试了“content://sms/sent“同样,即使这样也不起作用:(当我调试并查看日志时,我看不到任何日志。我认为我为从邮件中读取已发送项目而编写的代码不起作用。请你们中的任何人解释一下流程是如何进行的?是否将
registerContentObserver()
中的URI更改为
content://sms