【问题标题】:Android SmsManager send message to multiple recipient from sqlite databaseAndroid SmsManager 从 sqlite 数据库向多个收件人发送消息
【发布时间】:2018-10-10 07:44:21
【问题描述】:

我是 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);
        }
    }
}

【问题讨论】:

    标签: android sqlite smsmanager


    【解决方案1】:

    它只将它发送到第一个数字的原因是你没有循环通过你的结果。为了让它工作,你需要这样编写代码:

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

    【讨论】:

      【解决方案2】:

      首先,改变:

      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();
      

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

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

      【讨论】:

      • getReabableDatabase 不保护/停止写入。事实上getReababledatabase 在大多数情况下会得到一个可写的数据库。如果有问题只会得到一个只读数据库并且数据库只能以读取模式打开getReadableDatabase
      • @Uiv 是的,没错。
      【解决方案3】:

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

      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 没有行,那么它将为空(getCount 方法将返回 0)。因此if(res.moveToFirst()) .....if(res != null &amp;&amp; res.moveToFirst()) ..... 好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多