2013-07-20 2 views
1

내 장치를 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);} 

} 

미리 감사드립니다!

+0

당신은 이것을 어떻게합니까? at com.upm.radioC.Tools.checkData (Tools.java:26)' – Rajeev

+0

안녕하세요,이 부분은 GSM 데이터를 사용할 수 있는지 확인한 다음 사용 가능한 경우 true를 반환하고 사용할 수없는 경우 false를 반환합니다. 다음은 코드입니다. boolean checkData() { ConnectivityManager connManager = (ConnectivityManager) getSystemService (CONNECTIVITY_SERVICE); NetworkInfo mMobile = connManager.getNetworkInfo (ConnectivityManager.TYPE_MOBILE); 반환 mMobile.isConnected(); }' –

답변

1

getSystemService과 같은 컨텍스트와 관련이있는 것 같습니다. 서비스 컨텍스트를 Tools 클래스로 전달한 다음 getSystemService 호출에 해당 컨텍스트를 사용하십시오.

Tools 클래스 저장소 개인 변수에이 수신 Context (예를 들어 mContext)에서 다음 Servicio

private Tools NetWork = null; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Network = new Tools(this); 
} 

와의 onCreateTools 인스턴스를 생성하고 그 클래스의 방법에 그것을 사용합니다.

boolean checkData() { 
    ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(CONNECTIVITY_SERVICE); 
    NetworkInfo mMobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    return mMobile.isConnected(); 
} 

편집 : 이해 컨텍스트에 대한

, 아래를 참조 할 수 있습니다 참조하는

  1. demystifyind context

  2. Context, What Context

+0

당신의 correccion 잘 작동합니다, 많이 감사합니다. 나는 아직도 안드로이드에 대한 컨텍스트를 사용하는 것에 대해 혼란 스럽다.이 주제를 더 잘 이해할 수있는 문서를 추천 해 줄 수 있을까? –

+0

그것이 당신을 위해 잘 된 것을 기쁘게 생각합니다.나는 컨텍스트에 대한 전체적인 생각을 설명하려고하는 두 개의 참조를 추가했다. :-) – Rajeev

관련 문제