【问题标题】:Why android.telephony.SmsManager is not able to send message from Dialog Activity?为什么 android.telephony.SmsManager 无法从 Dialog Activity 发送消息?
【发布时间】:2015-03-13 11:57:24
【问题描述】:

在这里,我创建了一个警报 DialogActivity,其中“setPositiveButton”构建器,启动一个简单的对话框并尝试向收件人发送一个 android 电话短信。

但奇怪的是,对话框无法向收件人发送短信。请您帮我理解原因吗?

代码如下:

package com.example.demo;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class DialogActivity extends Activity 
{   
    private Dialog mDialog;
    String editTextEnterMobileNum;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder
        .setTitle("Incoming Server Message")
        .setMessage("text")
        .setCancelable(false)
        .setPositiveButton("eReceipt?", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();

                mDialog = new Dialog(DialogActivity.this);
                mDialog.setContentView(R.layout.ereceipt_dialog);                       
                mDialog.setTitle("User Input");
                editTextEnterMobileNum = ((EditText) mDialog.findViewById(R.id.eReceiptEditText)).getText().toString();
                mDialog.findViewById(R.id.eReceiptOkButton).setOnClickListener(
                        new OnClickListener() {

                            @Override
                            public void onClick(View v) {
                                dismissDialog();
                                try{
                                    android.telephony.SmsManager mSmsManager = android.telephony.SmsManager.getDefault();
                    mSmsManager.sendTextMessage(editTextEnterMobileNum, null, SmsReceiver.msgContent, null, null);
                                    Toast.makeText(getApplicationContext(), "Your SMS has sent successfully!", Toast.LENGTH_LONG).show();

                                }

                                   catch(Exception e){
                                        Toast.makeText(getApplicationContext(), "Your SMS sent has failed!", Toast.LENGTH_LONG).show();
                                        e.printStackTrace();
                                   }                        

                            }
                        });

                mDialog.show();              
          }
        })
        .setNegativeButton("Exit", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();

            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        //finish();
    }

    public void dismissDialog() {
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
    }

}

Logcat 的输出是:

03-13 18:09:58.139: E/ViewRootImpl(21086): sendUserActionEvent() mView == null
03-13 18:10:13.999: W/System.err(21086): java.lang.IllegalArgumentException: Invalid destinationAddress
03-13 18:10:14.009: W/System.err(21086):    at android.telephony.SmsManager.sendTextMessage(SmsManager.java:120)
03-13 18:10:14.009: W/System.err(21086):    at com.watchdata.qposdemo.DialogActivity$1$1.onClick(DialogActivity.java:66)
03-13 18:10:14.009: W/System.err(21086):    at android.view.View.performClick(View.java:4475)
03-13 18:10:14.009: W/System.err(21086):    at android.view.View$PerformClick.run(View.java:18786)
03-13 18:10:14.009: W/System.err(21086):    at android.os.Handler.handleCallback(Handler.java:730)
03-13 18:10:14.009: W/System.err(21086):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-13 18:10:14.009: W/System.err(21086):    at android.os.Looper.loop(Looper.java:176)
03-13 18:10:14.009: W/System.err(21086):    at android.app.ActivityThread.main(ActivityThread.java:5419)
03-13 18:10:14.009: W/System.err(21086):    at java.lang.reflect.Method.invokeNative(Native Method)
03-13 18:10:14.009: W/System.err(21086):    at java.lang.reflect.Method.invoke(Method.java:525)
03-13 18:10:14.009: W/System.err(21086):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
03-13 18:10:14.009: W/System.err(21086):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
03-13 18:10:14.009: W/System.err(21086):    at dalvik.system.NativeStart.main(Native Method)
03-13 18:10:14.629: E/ViewRootImpl(21086): sendUserActionEvent() mView == null
03-13 18:10:14.724: D/AbsListView(21086): onVisibilityChanged() is called, visibility : 8
03-13 18:10:14.724: D/AbsListView(21086): unregisterIRListener() is called 
03-13 18:10:14.729: D/AbsListView(21086): Get MotionRecognitionManager
03-13 18:10:14.744: D/AbsListView(21086): onVisibilityChanged() is called, visibility : 4
03-13 18:10:14.744: D/AbsListView(21086): unregisterIRListener() is called 
03-13 18:10:14.749: D/AbsListView(21086): onVisibilityChanged() is called, visibility : 0
03-13 18:10:14.749: D/AbsListView(21086): unregisterIRListener() is called 
03-13 18:10:14.854: D/AbsListView(21086): unregisterIRListener() is called 

在调试过程中,执行失败进入到OnClickListener()

mDialog.findViewById(R.id.eReceiptOkButton).setOnClickListener(
                        new OnClickListener() {

我不知道为什么?

【问题讨论】:

  • 你能发布异常吗?日志猫?
  • @Boban S : 我已经重新编辑了 logcat 捕获的异常语句。
  • 您发布的logcat与发送短信的代码无关。您是否在 logcat 中有错误?
  • 错误显示原因java.lang.IllegalArgumentException: Invalid destinationAddress,您输入的号码无效
  • 感谢博班指出问题...我分析并解决了问题并重新发布了正确的代码。

标签: android


【解决方案1】:

干杯!问题已解决。

mSmsManager.sendTextMessage() 方法的电话号码字段没有适当的实例化。唉!我犯了多么愚蠢的错误,花了一些时间才弄清楚。我相信我因为嵌套了 onClickListener() 方法而被误导了。呵呵……

我正在重新发布正确的代码,以便对其他人有所帮助。

public class DialogActivity extends Activity 
{   
    private Dialog mDialog;
    String editTextEnterMobileNum;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder
        .setTitle("Incoming Server Message")
        .setMessage("text")
        .setCancelable(false)
        .setPositiveButton("eReceipt?", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();

                mDialog = new Dialog(DialogActivity.this);
                mDialog.setContentView(R.layout.ereceipt_dialog);                       
                mDialog.setTitle("User Input");
                final EditText phoneNo = (EditText) mDialog.findViewById(R.id.eReceiptEditText);
                mDialog.findViewById(R.id.eReceiptOkButton).setOnClickListener(
                        new OnClickListener() {

                            @Override
                            public void onClick(View v) {
                                dismissDialog();
                                String number = phoneNo.getText().toString();
                                try{
                                    android.telephony.SmsManager mSmsManager = android.telephony.SmsManager.getDefault();
                    mSmsManager.sendTextMessage(number, null, SmsReceiver.msgContent, null, null);
                                    Toast.makeText(getApplicationContext(), "Your SMS has sent successfully!", Toast.LENGTH_LONG).show();

                                }

                                   catch(Exception e){
                                        Toast.makeText(getApplicationContext(), "Your SMS sent has failed!", Toast.LENGTH_LONG).show();
                                        e.printStackTrace();
                                   }                        

                            }
                        });

                mDialog.show();              
          }
        })
        .setNegativeButton("Exit", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();

            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        //finish();
    }

    public void dismissDialog() {
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
    }

}

【讨论】:

    【解决方案2】:

    您没有从数字字段中获取文本。

    替换行

    mSmsManager.sendTextMessage(editTextEnterMobileNum, null, SmsReceiver.msgContent, null, null);
    

    用这个

    mSmsManager.sendTextMessage(editTextEnterMobileNum.getText().toString(), null, SmsReceiver.msgContent, null, null);
    

    【讨论】:

    • S :但是我已经按照您之前在 mSmsManager.sendTextMessage() 中使用过的要求做了同样的事情。是的,真正的问题在于没有适当的“editTextEnterMobileNum”实例化。感谢您指出问题。我会使用正确的代码进行编辑以帮助他人。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2015-08-18
    • 1970-01-01
    • 2013-03-23
    • 2016-11-06
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多