2017-02-27 10 views
1

私は歩数計を使用するAndroidアプリを作成しようとしています。現在、ユーザーが電話を再起動/切り替えたときにサービスが起動するのに問題があります。私は5.1を使用しており、テストはシミュレータ上で行われています。ログがコンソールに表示されていないので、動作しているかどうかはわかりません。Android放送受信機が動作していませんRECEIVE_BOOT_COMPLETEDのサービス

ご協力いただきありがとうございます。

アプリのマニフェストクラス:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="app.apphub.devon.walkingquest"> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".WalkingQuestSplashScreen"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name=".BootReceiver" android:exported="true" android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filtering> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filtering> 

    </receiver> 
    <service android:name=".StepCounterSensorRegister" android:enabled="true" android:exported="true"/> 
</application> 

</manifest> 

ブートレシーバクラス: パブリッククラスBootReceiverはBroadcastReceiver {

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     Log.i("BROADCAST", "WALKING_QUEST_BOOT"); 
     Intent _intent = new Intent("app.apphub.devon.walkingquest.StepCounterSensorRegister"); 
     intent.setClass(context, StepCounterSensorRegister.class); 
     context.startService(_intent); 
     //context.startService(_intent); 
     //Toast.makeText(context,"Airplane mode on",Toast.LENGTH_LONG).show(); 
    } 
    else { 
     Log.i("FAIL","BROADCAST FAILED"); 
    } 
} 

StepCounterSensorRegisterクラス拡張:

public class StepCounterSensorRegister extends Service implements SensorEventListener { 

SensorManager sensorManager; 
Sensor sensor; 
long globalSteps; 
boolean flag = false; 


@Override 
public void onCreate(){ 

} 

public int onStartCommand(Intent intent, int flags, int startId) { 
    //Must run in background thread 
    Log.i("START","STEP_COUNTER_STARTED"); 
    registerSensor(sensorManager.SENSOR_DELAY_UI); 
    return START_STICKY; 
} 

public void onSensorChanged(SensorEvent event) { 

    if(!flag){ 

    } 
    if(event.sensor.getType() == Sensor.TYPE_STEP_COUNTER){ 
     Log.i("STEPS DETECTED",""+globalSteps); 
     globalSteps++; 
    } 
} 

public boolean registerSensor(int accuracy) { 
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    try { 
     sensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); 
    }catch (Exception e){ 
     Log.i("ERROR", e.getMessage()); 
    } 

    if(sensor == null) { 
     Log.i("FAILED","Sensor returned null"); 
     return false; 
    } 
    else { 
     Log.i("SUCCESS", "Successfully registered sensor"); 
     sensorManager.registerListener(this, sensor, accuracy); 
     return true; 
    } 

} 

答えて

2

二つを私が見るものはあなたということですあなたのマニフェストで何かが間違っていると宣言しました:

<receiver android:name=".BootReceiver" android:exported="true" android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filtering> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filtering> 

    </receiver> 
  1. intent-filtering doesn'tが存在し、それは受信機タグ内に置くドント、android:permission="android.permission.RECEIVE_BOOT_COMPLETED"がここに置き忘れているintent-filter
  2. の権限です。既に上記の定義済みです。

Logcatに正しいフィルタを設定し、2つの異なるタグ "BROADCAST"と "FAIL"を使用していることを確認してください。

+0

ありがとうございます!余分なパーミッションを削除し、インテントフィルタを修正することが私にとってうまくいった。 –

関連する問題