2012-06-07 20 views
1

嗨我正在做一個應用程序,只使用廣播接收器。它有三個目的。當接收到包含特定代碼的SMS時,它發送GPS數據。另一個代碼發送傳感器數據。到目前爲止沒有問題。但對於電池,我無法做到這一點,因爲registerreceiver()函數。由於我沒有使用活動和onCreate方法,我可以在收到短信時發送電池數據嗎?電池狀態沒有活動只使用broadcastreceiver

當我試圖在broadcastreceiver的onreceive()方法中調整它時,我的應用程序崩潰了。我到處搜索活動已創建。我只想在廣播接收機內部做所有事情。

我的代碼是這樣的:使用registerReceiver()時,爲了獲得粘電池改變Intent使用的應用程序Context

public class MyPhoneReceiver extends BroadcastReceiver{ 
double current_lat,current_lng; 
LocationManager mlocManager; 
LocationListener mlocListener; 
//addition////////////////////////////// 
SensorManager mSensorManager; 

Sensor mAccelerometer; 
//////////////////// 

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
private static final String TAG = "SMSBroadcastReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
Log.i(TAG, "Intent recieved: rama" + intent.getAction()); 


Bundle bundle = intent.getExtras(); 
if (bundle != null) { 
Object[] pdus = (Object[]) bundle.get("pdus"); 
final SmsMessage[] messages = new SmsMessage[pdus.length]; 
for (int i = 0; i < pdus.length; i++) 
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
if (messages.length > -1) { 
String messagebody=messages[0].getMessageBody(); 
Log.i(TAG, "Message recieved: in message receied " + messages[0].getMessageBody()); 
if(messagebody.toString().matches("HDPK GPS")) 
{ 
Log.i(TAG, "Message recieved: HDPK RECEIVED " + messages[0].getMessageBody()); 
mlocManager=(LocationManager)context.getSystemService(context.LOCATION_SERVICE); 
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,new MyLocationListener()); 
} 
if(messagebody.toString().matches("HDPK SENS")) 
{ 
Log.i(TAG, "Message recieved: in msensior "); 
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mSensorManager.registerListener(new MySensorListener(), mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 
if(messagebody.toString().matches("HDPK BAT")) 
{ 
Log.i(TAG, "Message recieved: in battery "); 
IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batt=context.registerReceiver(null,filter); 
int level = batt.getIntExtra("EXTRA_LEVEL", 0); 
Log.i(TAG, "Message recieved: in battery level is "+level); 
SmsManager sender=SmsManager.getDefault(); 
sender.sendTextMessage("9762281814", null, "Level is"+level, null,null); 
} 



} 
} 
} 

public class MySensorListener implements SensorEventListener 
{ 
public void onAccuracyChanged(Sensor arg0, int arg1) { 
// TODO Auto-generated method stub 

} 

public void onSensorChanged(SensorEvent event) { 
// TODO Auto-generated method stub 
Log.i(TAG, "Message recieved: in msensior event change "); 
float x = event.values[0]; 

float y = event.values[1]; 

float z = event.values[2]; 
SmsManager sender=SmsManager.getDefault(); 
String Text="x :"+x+" Y:"+y+ " Z:"+z; 
sender.sendTextMessage("9762281814",null, Text, null, null); 
mSensorManager.unregisterListener(this); 
} 

} 

public class MyLocationListener implements LocationListener{ 

public void onLocationChanged(Location location) { 
// TODO Auto-generated method stub 
current_lat=location.getLatitude(); 
current_lng=location.getLongitude(); 
SmsManager sender=SmsManager.getDefault(); 
String Text = "My Location is : Latitude ->" +current_lat+" Longitude ->" + current_lng; 
sender.sendTextMessage("9762281814", null, Text, null, null); 

mlocManager.removeUpdates(this); 

} 

public void onProviderDisabled(String provider) { 
// TODO Auto-generated method stub 

} 

public void onProviderEnabled(String provider) { 
// TODO Auto-generated method stub 

} 

public void onStatusChanged(String provider, int status, Bundle extras) { 
// TODO Auto-generated method stub 

} 


} 

} 

回答

7

嘗試,而不是廣播接收器Context的。像這樣:

IntentFilter filter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent batt=context.getApplicationContext().registerReceiver(null,filter); 
int level = 99; // Default to some unknown/wild value 
// registerReceiver method call could return null, so check that! 
if (batt != null) { 
    level = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
} 
+0

我試過你的代碼,但它不工作,我需要給這種許可嗎? – Lucifer

+0

不,你不需要任何權限。你的意思是「它不工作」?從調用registerReceiver()返回的是什麼? logcat中的任何錯誤? –

+0

雅,我現在工作,但在我的情況下,我使用的是'level = batt.getIntExtra(「level」,0);',EXTRA_LEVEL不工作,我的要求是檢查BroadcastReceiver的電池電量,一個成功運行,感謝您的幫助:) – Lucifer