2014-11-05 14 views
0

Я написал программу, в которой у меня есть две службы в одном, я собираю данные с акселерометра, а во втором собираю данные из гироскопа. Я использую wake_lock в обоих. Проблема в том, что он работает только тогда, когда я запускаю его из студии Android, а затем, когда я запускаю его во второй раз с телефона, он не работает и перестает собирать данные, когда я блокирую телефон. Можете ли вы помочь мне, где проблема? THxwakelock не работает должным образом

package emzet.acc2txt; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

private static final String LOG_TAG = "aktivita" ; 
private Button btnStart, btnStop; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btnStart = (Button) findViewById(R.id.btnStart); 
    btnStop = (Button) findViewById(R.id.btnStop); 
    btnStart.setEnabled(true); 
    btnStop.setEnabled(true); 
    Log.d(LOG_TAG, "ON CREATE"); 

} 

public void onStartClick(View view) { 
    Intent serviceIntentAcc = new Intent(this, accService.class); 
    startService(serviceIntentAcc); 
    Intent serviceIntentGyro = new Intent(this, gyroService.class); 
    startService(serviceIntentGyro); 
    btnStop.setEnabled(true); 
    btnStart.setEnabled(false); 
    Log.d(LOG_TAG, "ON START CLICK"); 

} 

public void onStopClick(View view) { 
    stopService(new Intent(this, accService.class)); 
    stopService(new Intent(this, gyroService.class)); 
    btnStart.setEnabled(true); 
    btnStop.setEnabled(false); 
    Log.d(LOG_TAG, "ON STOP CLICK"); 
} 



} 

Сервис акселерометр:

package emzet.acc2txt; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Environment; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.lang.Object; 

/** 
* Created by Miroslav on 2.11.2014. 
* ALL Rights reserved to eMZet 
*/ 
public class accService extends Service implements SensorEventListener{ 

private static final String LOG_TAG = "aktivita" ; 
String root = Environment.getExternalStorageDirectory().toString(); 
protected static SensorManager sensorManager; 
// protected static SensorManager sensorManager2; 
protected static Sensor accelerometer; 
// protected static Sensor gyroscope; 
private FileWriter writer; 
private PowerManager.WakeLock wakeLock; 

@Override 
public IBinder onBind(Intent intent) { 
    Log.d(LOG_TAG, "SERVICE - ON BIND"); 
    return null; 
} 

@Override 
public void onCreate(){ 
    // accelerometer 
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    // gyroscope 
    // sensorManager2 = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    // gyroscope = sensorManager2.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

    Toast.makeText(this, "Zapisujem . . . ", Toast.LENGTH_LONG).show(); 
    // register accelerometer sensor 
    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    // register gyroscope sensor 
    //sensorManager2.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL); 

    Log.d(LOG_TAG, "SERVICE - ON CREATE"); 

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "funguj"); 
    wakeLock.acquire(); 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    if(writer != null) { 
     try { 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    sensorManager.unregisterListener(this); 
    Log.d(LOG_TAG, "SERVICE - ON DESTROY"); 
    wakeLock.release(); 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    try { 
     writer = new FileWriter(root + "/data_acc.txt",true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Log.d(LOG_TAG, "SERVICE - ON START COMMAND"); 
    return START_STICKY; 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

@Override 
public void onSensorChanged(SensorEvent event) { 

    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
    SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss:SSS"); 
    String s = time.format(new java.util.Date()); 
    try { 
     writer.write(s+"|"+x+"|"+y+"|"+z+"\n"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
} 

Услуга для гироскопа:

package emzet.acc2txt; 

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Environment; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.FileWriter; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 

/** 
* Created by Miroslav on 2.11.2014. 
* ALL Rights reserved to eMZet 
*/ 
public class gyroService extends Service implements SensorEventListener{ 

private static final String LOG_TAG = "aktivita" ; 
String root = Environment.getExternalStorageDirectory().toString(); 
protected static SensorManager sensorManager; 
protected static Sensor gyroscope; 
private FileWriter writer; 
private PowerManager.WakeLock wakeLockGyro; 

@Override 
public IBinder onBind(Intent intent) { 
    Log.d(LOG_TAG, "SERVICE - ON BIND"); 
    return null; 
} 

@Override 
public void onCreate(){ 
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    // gyroscope 
    gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

    Toast.makeText(this, "Zapisujem . . . ", Toast.LENGTH_LONG).show(); 
    // register gyroscope sensor 
    sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL); 

    Log.d(LOG_TAG, "SERVICE - ON CREATE"); 

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLockGyro = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "funguj"); 
    wakeLockGyro.acquire(); 
} 

@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    if(writer != null) { 
     try { 
      writer.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    sensorManager.unregisterListener(this); 
    Log.d(LOG_TAG, "SERVICE - ON DESTROY"); 
    wakeLockGyro.release(); 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    try { 
     writer = new FileWriter(root + "/data_gyro.txt",true); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Log.d(LOG_TAG, "SERVICE - ON START COMMAND"); 
    return START_STICKY; 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

@Override 
public void onSensorChanged(SensorEvent event) { 

    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
    SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss:SSS"); 
    String s = time.format(new java.util.Date()); 
    try { 
     writer.write(s+"|"+x+"|"+y+"|"+z+"\n"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
} 

ответ

0

я думаю, вы должны использовать PARTIAL_WAKELOCK

изменения этого:

wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "funguj"); 

к этому:

wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "funguj");

это держит процессор на после того, как вы нажали кнопку блокировки link

вы установили разрешение на андроид манифеста?

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

Да, у меня есть .. Я использую MIUI rom на телефоне xiaomi, может быть, проблема? Я просто обнаружил, что когда я перезапускаю телефон с первого запуска, он работает хорошо. – Mirko

+0

Я добавил что-то к своему ответу @Mirko – Rikkert09

+0

Спасибо, это сработало ... Вы меня спасли: D thx;) Но можете ли вы рассказать мне, почему full_wake_lock не работает? Есть идеи ? – Mirko

Смежные вопросы