我正在使用广播类来使用此代码来收听短信消息
package com.escortme.basic;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class SMSReceiverActivity extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Parse the SMS.
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
// Retrieve the SMS.
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++)
{
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
// In case of a particular App / Service.
//if(msgs[i].getOriginatingAddress().equals("+91XXX"))
//{
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
//}
}
// Display the SMS as Toast.
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Pol_ViewActivity appState = ((Pol_ViewActivity)getApplicationContext()); // ERROR
appState.move_map_to("33.786047","-59.187287");
}
}
}
并且它在清单中定义如此
<receiver
android:name="com.escortme.basic.SMSReceiverActivity"
android:enabled="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
但问题是它说“方法getApplicationContext()未定义类型SMSReceiverActivity”。
有谁知道为什么会发生这种情况以及如何解决这个问题? 感谢
答案 0 :(得分:14)
查看onReceive()
的方法签名public void onReceive(Context context, Intent intent) {
您正在将上下文作为参数传递。您应该在需要时使用该上下文。
Pol_ViewActivity appState = ((Pol_ViewActivity)context);
编辑:我也不确切地知道你要做什么。但是你可能不应该尝试获取一个Activity对象并像上面那样调用一个方法。
答案 1 :(得分:2)
我希望这对你的朋友有所帮助。
尝试导入此包( import android.telephony.gsm.SmsManager; )
// ---向另一台设备发送短信---
private void sendSMS(String phoneNumber,String message)
{
String SENT =“SMS_SENT”;
String DELIVERED =“SMS_DELIVERED”;
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
答案 2 :(得分:1)
获取应用程序上下文的一个原因是获取def compare_and_divide(df):
for i in range(len(df)-1):
# df[0] for all values in col 0 .iloc[i] for value in row
if df[0].iloc[i+1] >= df[0].iloc[i]:
continue
else:
df[0].iloc[i+1] = df[0].iloc[i]
return df[0].div(df[1]) # .div() function to divide values in col 0 by col 1
compare_and_divide(dataframe)
0 0.422500
1 0.614545
2 0.505970
3 0.566667
4 0.680000 # 340/500 value mentioned in the question
5 0.790698
6 0.971429
7 1.002950
8 1.005917
9 1.014925
10 1.030303
11 1.096774
12 1.096774
13 1.133333
14 1.133333
15 1.172414
dtype: float64
,因为它必须在应用程序上下文中查找,否则内存将在设备上泄漏&lt; Android N。
正如Someone Somewhere所述,在WIFI_SERVICE
内,只需使用onReceive()
。