显示进度对话框,同时等待接收短信 [英] show progress dialog while waiting for receiving SMS
问题描述
我想编写一个应用程序显示一个进度对话框,同时等待接收短信。当收到短信,非空的TextView smsReceive是担任驳回进度对话框的条件。但它得到的RuntimeException。你能告诉我该怎么在code修改。
包cx.opseng.PerfTOLD;进口android.app.Activity;
进口android.app.ProgressDialog;
进口android.os.Bundle;
进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.telephony.SmsManager;
进口android.telephony.SmsMessage;
进口android.util.Log;
进口android.widget.TextView;公共类短信延伸活动{
/ **当第一次创建活动调用。 * /静态的TextView smsReceive;
静态的TextView smsReceiveChar;@覆盖
保护无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.sms); 意向I = getIntent();
//接收数据
弦章= i.getStringExtra(章);
字符串端口= i.getStringExtra(端口); 字符串smsMessage =章+端口; //在屏幕上显示短信发送消息
TextView的smsSend =(的TextView)findViewById(R.id.smsSend);
smsSend.setText(smsMessage);
Log.i(smsSend,将String.valueOf(smsSend.getText()));
//发送短信
SmsManager SM = SmsManager.getDefault();
串号=5556;
sm.sendTextMessage(数字,空,smsMessage,NULL,NULL); ProgressDialog对话框=新ProgressDialog(Sms.this);
dialog.setMessage(努力工作......);
dialog.setIndeterminate(真);
dialog.setCancelable(真);
dialog.show(); //接收短信
smsReceive = NULL;
smsReceive =(的TextView)findViewById(R.id.smsReceive);
Log.i(smsReceive,smsReceive.getText()的toString());
如果(smsReceive.getText()。的toString()!= NULL){
Log.i(smsReceive,smsReceive.getText()的toString());
字符串smsChar = smsReceive.getText()的toString()。
整数smsChar2 = smsChar.length();
字符串smsChar3 = Integer.toString(smsChar2);
Log.i(smsReceive2,smsChar3);
smsReceiveChar.setText(smsChar);
smsReceiveChar =(的TextView)findViewById(R.id.smsReceiveChar);
} 如果(smsReceiveChar.getText()。的toString().equals(信息)){
dialog.dismiss();
}}
公共静态无效updateMessageBox(弦乐味精)
{
smsReceive.append(MSG);
smsReceiveChar.append(MSG);
}
}
公共类SmsReceiver扩展广播接收器{公共无效的onReceive(上下文的背景下,意图意图)
{
捆绑包= intent.getExtras(); [对象]消息=(对象[])bundle.get(的PDU);
SmsMessage [] =短信新SmsMessage [messages.length] 对于(INT N = 0; N< messages.length; N ++){
短信[N] = SmsMessage.createFromPdu((字节[])消息[N]);
} 对于(SmsMessage消息:SMS){
字符串NUM = msg.getOriginatingAddress();
Log.i(短信发送,NUM);
如果(num.equals(15555215556)){
Sms.updateMessageBox(\\ n从:+ msg.getOriginatingAddress()+
\\ n+留言:+ msg.getMessageBody()+\\ n); }
}
}
}
的logcat的如下:
11月8日至14日:16:56.152:E / AndroidRuntime(2091):致命异常:主要
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):了java.lang.RuntimeException:无法启动活动ComponentInfo {cx.opseng.PerfTOLD / cx.opseng.PerfTOLD.Sms}:java.lang.StringIndexOutOfBoundsException
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread.access $ 2300(ActivityThread.java:125)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.os.Handler.dispatchMessage(Handler.java:99)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.os.Looper.loop(Looper.java:123)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread.main(ActivityThread.java:4627)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在java.lang.reflect.Method.invokeNative(本机方法)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在java.lang.reflect.Method.invoke(Method.java:521)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在dalvik.system.NativeStart.main(本机方法)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):因:java.lang.StringIndexOutOfBoundsException
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在java.lang.String.substring(String.java:1579)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在cx.opseng.PerfTOLD.Sms.onCreate(Sms.java:88)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11月8日至一十四日:16:56.152:E / AndroidRuntime(2091):11 ...更多
我做了这对我的作品的例子。
我曾与进步问题对话框不工作这是我使用的线程所造成的。
的AndroidManifest.xml
:
<表明包=com.mw.stackoverflow.example02
安卓版code =1
机器人:=的versionName1.0的xmlns:机器人=http://schemas.android.com/apk/res/android> <用途-SDK
安卓的minSdkVersion =10
机器人:targetSdkVersion =15/>
<使用许可权的android:NAME =android.permission.RECEIVE_SMS/> <应用
机器人:图标=@绘制/ ic_launcher
机器人:标签=@字符串/ APP_NAME
机器人:主题=@风格/ AppTheme> <活动
机器人:名字=。MainActivity
机器人:标签=@字符串/ title_activity_main>
&所述;意图滤光器>
<作用机器人:名字=android.intent.action.MAIN/> <类机器人:名字=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT;
< /用途>< /清单>
MainActivity.java
:
包com.mw.stackoverflow.example02;进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.telephony.SmsMessage;
进口android.util.Log;
进口android.widget.TextView;
进口android.widget.Toast;
进口android.app.Activity;
进口android.app.ProgressDialog;
进口android.content.IntentFilter;公共类MainActivity扩展活动实现SmsUpdater
{
私有静态最后弦乐TAG =MainActivity; 私人SmsReceiver mSmsReceiver; 私有类ExaminMessagesTask扩展的AsyncTask< SmsMessage,太虚,布尔>
{
ProgressDialog mProgressDialog; @覆盖
在preExecute保护无效()
{
super.on preExecute(); mProgressDialog =新ProgressDialog(MainActivity.this);
mProgressDialog.setMessage(接收短信。);
mProgressDialog.setIndeterminate(真);
mProgressDialog.setCancelable(真); mProgressDialog.show();
}
保护布尔doInBackground(SmsMessage ...消息)
{
如果(messages.length大于0)
{
Log.d(TAG显示进度对话框); } 对于(SmsMessage玛:消息)
{
Log.d(TAG,收到的消息);
} 诠释计数= 0;
对于(SmsMessage消息:消息)
{
字符串NUM = msg.getOriginatingAddress();
Log.d(TAG,NUM); (+(计数++)处理信息)mProgressDialog.setTitle; 尝试
{
视频下载(1000);
}
赶上(InterruptedException的E)
{
}
} 返回true;
} 保护无效onProgressUpdate(整数...进度)
{ } 保护无效onPostExecute(布尔结果)
{
mProgressDialog.dismiss();
}
} @覆盖
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main); mSmsReceiver =新SmsReceiver(本);
} @覆盖
保护无效onResume()
{
super.onResume();
IntentFilter的过滤器=新的IntentFilter();
filter.addAction(android.provider.Telephony.SMS_RECEIVED);
registerReceiver(mSmsReceiver,过滤器);
} @覆盖
公共无效的onPause()
{
super.onPause();
unregisterReceiver(mSmsReceiver);
} @覆盖
公共无效gotSms(最终SmsMessage [] M)
{
Log.d(TAG的onReceive,消息数:+ m.length); runOnUiThread(新的Runnable()
{
公共无效的run()
{
Toast.makeText(MainActivity.this,收到短信,Toast.LENGTH_SHORT).show(); 新ExaminMessagesTask()执行(米);
}
});
}}
SmsReceiver.java
:
包com.mw.stackoverflow.example02;进口android.os.Bundle;
进口android.app.Activity;
进口android.app.ProgressDialog;
进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.support.v4.app.NavUtils;
进口android.telephony.SmsMessage;类SmsReceiver扩展广播接收器
{
私有静态最后弦乐TAG =SMSREC; 私人SmsUpdater mSmsUpdater; 公共SmsReceiver(SmsUpdater U)
{
超();
mSmsUpdater = U;
} 公共无效的onReceive(上下文的背景下,意图意图)
{
Log.d(TAG的onReceive叫。); 捆绑包= intent.getExtras(); [对象]消息=(对象[])bundle.get(的PDU);
SmsMessage [] =短信新SmsMessage [messages.length]
对于(INT N = 0; N< messages.length; N ++)
{
短信[N] = SmsMessage.createFromPdu((字节[])消息[N]);
} mSmsUpdater.gotSms(SMS);
}
}
SmsUpdater.java
包com.mw.stackoverflow.example02;进口android.telephony.SmsMessage;公共接口SmsUpdater
{
无效gotSms(SmsMessage []米);
}
I would like to write an app to show a progress dialog while waiting to receive a SMS. When receiving SMS, the non-null TextView smsReceive is served as the condition to dismiss progress dialog. But it gets runtimeException. Could you show me what to change in the code.
package cx.opseng.PerfTOLD;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.TextView;
public class Sms extends Activity {
/** Called when the activity is first created. */
static TextView smsReceive;
static TextView smsReceiveChar;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.sms);
Intent i = getIntent();
// Receiving the Data
String reg = i.getStringExtra("reg");
String port = i.getStringExtra("port");
String smsMessage = reg + port ;
// Show SMS sent message on screen
TextView smsSend = (TextView) findViewById(R.id.smsSend);
smsSend.setText(smsMessage);
Log.i("smsSend",String.valueOf(smsSend.getText()));
// Send SMS message
SmsManager sm = SmsManager.getDefault();
String number = "5556";
sm.sendTextMessage(number, null, smsMessage, null, null);
ProgressDialog dialog = new ProgressDialog(Sms.this);
dialog.setMessage("working hard......");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
// Receive SMS message
smsReceive = null;
smsReceive = (TextView) findViewById(R.id.smsReceive);
Log.i("smsReceive",smsReceive.getText().toString());
if (smsReceive.getText().toString() != null) {
Log.i("smsReceive",smsReceive.getText().toString());
String smsChar = smsReceive.getText().toString();
Integer smsChar2 = smsChar.length();
String smsChar3 = Integer.toString(smsChar2);
Log.i("smsReceive2",smsChar3);
smsReceiveChar.setText(smsChar);
smsReceiveChar = (TextView) findViewById(R.id.smsReceiveChar);
}
if (smsReceiveChar.getText().toString() .equals("Message")) {
dialog.dismiss();
}
}
public static void updateMessageBox(String msg)
{
smsReceive.append(msg);
smsReceiveChar.append(msg);
}
}
public class SmsReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent)
{
Bundle bundle=intent.getExtras();
Object[] messages=(Object[])bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
for(int n=0;n<messages.length;n++){
sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg:sms){
String num = msg.getOriginatingAddress();
Log.i("SMS sender",num);
if (num.equals("15555215556")) {
Sms.updateMessageBox("\nFrom: " + msg.getOriginatingAddress() +
"\n" + "Message: " + msg.getMessageBody() + "\n"); }
}
}
}
The logcat is as follows:
08-14 11:16:56.152: E/AndroidRuntime(2091): FATAL EXCEPTION: main
08-14 11:16:56.152: E/AndroidRuntime(2091): java.lang.RuntimeException: Unable to start activity ComponentInfo{cx.opseng.PerfTOLD/cx.opseng.PerfTOLD.Sms}: java.lang.StringIndexOutOfBoundsException
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.os.Handler.dispatchMessage(Handler.java:99)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.os.Looper.loop(Looper.java:123)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-14 11:16:56.152: E/AndroidRuntime(2091): at java.lang.reflect.Method.invokeNative(Native Method)
08-14 11:16:56.152: E/AndroidRuntime(2091): at java.lang.reflect.Method.invoke(Method.java:521)
08-14 11:16:56.152: E/AndroidRuntime(2091): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-14 11:16:56.152: E/AndroidRuntime(2091): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-14 11:16:56.152: E/AndroidRuntime(2091): at dalvik.system.NativeStart.main(Native Method)
08-14 11:16:56.152: E/AndroidRuntime(2091): Caused by: java.lang.StringIndexOutOfBoundsException
08-14 11:16:56.152: E/AndroidRuntime(2091): at java.lang.String.substring(String.java:1579)
08-14 11:16:56.152: E/AndroidRuntime(2091): at cx.opseng.PerfTOLD.Sms.onCreate(Sms.java:88)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-14 11:16:56.152: E/AndroidRuntime(2091): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-14 11:16:56.152: E/AndroidRuntime(2091): ... 11 more
I made an example which works for me.
I had issues with the progress dialog not working which was caused by my use of threading.
AndroidManifest.xml
:
<manifest package="com.mw.stackoverflow.example02"
android:versionCode="1"
android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java
:
package com.mw.stackoverflow.example02;
import android.os.AsyncTask;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.IntentFilter;
public class MainActivity extends Activity implements SmsUpdater
{
private static final String TAG = "MainActivity";
private SmsReceiver mSmsReceiver;
private class ExaminMessagesTask extends AsyncTask<SmsMessage, Void, Boolean>
{
ProgressDialog mProgressDialog;
@Override
protected void onPreExecute()
{
super.onPreExecute();
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Receiving SMS.");
mProgressDialog.setIndeterminate(true);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
}
protected Boolean doInBackground(SmsMessage... messages)
{
if (messages.length > 0)
{
Log.d(TAG, "Showing progress dialog.");
}
for (SmsMessage m: messages)
{
Log.d(TAG, "Message received");
}
int count = 0;
for(SmsMessage msg:messages)
{
String num = msg.getOriginatingAddress();
Log.d(TAG, num);
mProgressDialog.setTitle("Processing message " + (count++));
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
}
return true;
}
protected void onProgressUpdate(Integer... progress)
{
}
protected void onPostExecute(Boolean result)
{
mProgressDialog.dismiss();
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSmsReceiver = new SmsReceiver(this);
}
@Override
protected void onResume()
{
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSmsReceiver, filter);
}
@Override
public void onPause()
{
super.onPause();
unregisterReceiver(mSmsReceiver);
}
@Override
public void gotSms(final SmsMessage[] m)
{
Log.d(TAG, "OnReceive, number of messages: " + m.length);
runOnUiThread(new Runnable()
{
public void run()
{
Toast.makeText(MainActivity.this, "SMS received", Toast.LENGTH_SHORT).show();
new ExaminMessagesTask().execute(m);
}
});
}
}
SmsReceiver.java
:
package com.mw.stackoverflow.example02;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
import android.telephony.SmsMessage;
class SmsReceiver extends BroadcastReceiver
{
private static final String TAG = "SMSREC";
private SmsUpdater mSmsUpdater;
public SmsReceiver(SmsUpdater u)
{
super();
mSmsUpdater = u;
}
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, "OnReceive called.");
Bundle bundle=intent.getExtras();
Object[] messages=(Object[])bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[messages.length];
for(int n=0;n<messages.length;n++)
{
sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
}
mSmsUpdater.gotSms(sms);
}
}
SmsUpdater.java
package com.mw.stackoverflow.example02;
import android.telephony.SmsMessage;
public interface SmsUpdater
{
void gotSms(SmsMessage[] m);
}
这篇关于显示进度对话框,同时等待接收短信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!