Android SmsManager从sqlite数据库向多个收件人发送消息

时间:2018-10-10 07:44:21

标签: android sqlite smsmanager

我是android的新手,请为我解决问题。我想发送消息到多个号码。这些数字将保存在SQLite数据库中。我想将消息发送到数据库表中保存的所有号码。

到目前为止,这是我的代码,它仅向我数据库中的一个号码发送短信。它只会发送到我表中的第一个号码。

private void sendSMS(String message) {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SEND_SMS},
                MY_PERMISSION_REQUEST_SEND_SMS);
    }else{
        SmsManager sms = SmsManager.getDefault();
        SQLiteDatabase db = myDB.getWritableDatabase();
        Cursor res = db.rawQuery("select * from recipients_tbl", null);
        if(res != null && res.moveToFirst()) {
            String num = res.getString(1);
            sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

仅将其发送到第一个数字的原因是您没有循环搜索结果。为了使其正常工作,您将需要这样编写代码:

if(res != null){
    for(res.moveToFirst(); !res.isAfterLast(); res.moveToNext())
    {
        String num = res.getString(1);
        sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
    }
}

答案 1 :(得分:1)

您需要做的就是遍历游标,例如

private void sendSMS(String message) {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
            != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SEND_SMS},
                MY_PERMISSION_REQUEST_SEND_SMS);
    }else{
        SmsManager sms = SmsManager.getDefault();
        SQLiteDatabase db = myDB.getWritableDatabase();
        Cursor res = db.rawQuery("select * from recipients_tbl", null);
        while (res.moveToNext()) {  //<<<<<<<<<< CHANGED
            String num = res.getString(1);
            sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
        }
        res.close();
    }
}
  • 注意检查从SQLiteDatabase方法(例如query或rawQuery)返回的Cursor是无用的,因为将返回有效的Cursor。如果Cursor没有行,则它将为空(getCount方法将返回0)。因此,if(res.moveToFirst()) .....if(res != null && res.moveToFirst()) .....更好。

答案 2 :(得分:1)

首先,改变:

SQLiteDatabase db = myDB.getWritableDatabase();

收件人:

SQLiteDatabase db = myDB.getReadableDatabase();

因为您没有写数据库。

然后,您要做的是遍历每一行:

while(res.moveToNext())
{
    String num = res.getString(1);
    sms.sendTextMessage(num, null, message, sentPI, deliveredPI);
}
res.close();

您知道,Cursor指向第一行,您必须通过moveToNext()将光标移至下一行。最后,不要忘记关闭Cursor

FYK:What's the best way to iterate an Android Cursor?