내 장치를 AC로 연결하면 플레이어의 주요 목표는 시작됩니다. 첫 번째 버전은 브로드 캐스트 리시버 만 사용했고, 일단 작동하면 안드로이드 OS 버려진 리시버의 정상적인 동작을 제외하고는 잘 작동합니다. 좀 더 영구적 인 것을 찾고 있습니다. 브로드 캐스트 리시버를 활성 상태로 유지하기 위해 서비스를 사용하려고하기 때문에, 하지만 이해할 수없는 오류가 발생하고 있습니다.서비스에서 방송 수신기를 관리하는 방법
그래서 서비스 내에서 브로드 캐스트 리시버를 사용할 수있는 방법은 무엇입니까?
로그와 코드의 일부를 넣습니다.
오류 :
07-19 08:03:27.019: ERROR/AndroidRuntime(15785): FATAL EXCEPTION: main
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in [email protected]
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
at android.app.Activity.getSystemService(Activity.java:3536)
at com.upm.radioC.Tools.checkData(Tools.java:26)
at com.upm.radioC.Servicio$1.onReceive(Servicio.java:60)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
메인 클래스
public class Inicio extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflador = getMenuInflater();
inflador.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem opcion) {
TextView btn = (TextView) findViewById(R.id.txtEtiqueta);
Intent svc = new Intent(this, Servicio.class);
switch (opcion.getItemId()) {
case R.id.mnuRegistra:
startService(svc);
btn.setText("Monitoreo Iniciado");
break;
case R.id.mnuLibera:
stopService(svc);
btn.setText("Monitoreo Detenido");
break;
}
return super.onMenuItemSelected(featureId, opcion);
}
}
서비스 클래스
public class Servicio extends Service {
private BroadcastReceiver receiver;
private IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
private Tools NetWork = new Tools(); //Custom Class for activate/deactivate GSM data
@Override
public IBinder onBind(Intent arg0) {
return null;}
@Override
public void onCreate() {
super.onCreate();}
@Override
public int onStartCommand(Intent i, int flags, int startID) {
_startService();
return START_STICKY; }
@Override
public void onDestroy() {
super.onDestroy();
_shutdownService(); }
private void _startService() {
receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
if (plugged == BatteryManager.BATTERY_PLUGGED_USB) {
Toast.makeText(getApplicationContext(), "Conectado a USB", Toast.LENGTH_LONG).show();
}else if (plugged == BatteryManager.BATTERY_PLUGGED_AC) {
if (!NetWork.checkData()) try {
NetWork.turnData(true);
} catch (Exception e) {
e.printStackTrace();
}
Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("tunein.player");
startActivity(LaunchIntent);
Toast.makeText(getApplicationContext(), "Conectado a AC", Toast.LENGTH_LONG).show();
} else {
if (NetWork.checkData()) try {
NetWork.turnData(false);
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), "Desconectado de las fuentes de poder", Toast.LENGTH_LONG).show();
}
}
};
registerReceiver(receiver, filter);
}
private void _shutdownService() {
unregisterReceiver(receiver);}
}
미리 감사드립니다!
당신은 이것을 어떻게합니까? at com.upm.radioC.Tools.checkData (Tools.java:26)' – Rajeev
안녕하세요,이 부분은 GSM 데이터를 사용할 수 있는지 확인한 다음 사용 가능한 경우 true를 반환하고 사용할 수없는 경우 false를 반환합니다. 다음은 코드입니다. boolean checkData() { ConnectivityManager connManager = (ConnectivityManager) getSystemService (CONNECTIVITY_SERVICE); NetworkInfo mMobile = connManager.getNetworkInfo (ConnectivityManager.TYPE_MOBILE); 반환 mMobile.isConnected(); }' –