2016-10-20 1 views
7

J'essaie de développer une application pour Android qui utilise l'accéléromètre du téléphone. Il fonctionne partout sauf sur le téléphone de Huawei (test sur P9). J'ai coché l'option "continuer à courir avec un écran noir" et protéger l'application avec l'économiseur de batterie (option de la batterie).Mon Huawei tue mon application android wakelock

Je ne vois pas la solution, je demande donc de vous :-) Ceci est mon activité:

public class MainActivity extends AppCompatActivity { 

private static final String TAG = "MainActivity"; 
private MyService mService; 
private boolean mIsRunning; 
private MyService.ICallback mCallback = new MyService.ICallback() { 
    public void changed() { 
     Log.i(TAG, "CHANGED"); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(!mIsRunning) { 
     startStepService(); 
    } 
    bindStepService(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if(mIsRunning && mService != null) { 
     unbindStepService(); 
    } 
} 

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     mService = ((MyService.StepBinder)service).getService(); 
     mService.registerCallback(mCallback); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mService = null; 
    } 
}; 

private void startStepService() { 
    if (! mIsRunning) { 
     mIsRunning = true; 
     startService(new Intent(MainActivity.this, MyService.class)); 
    } 
} 

private void bindStepService() { 
    bindService(new Intent(MainActivity.this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); 
} 

private void unbindStepService() { 
    unbindService(mConnection); 
} 

Et mon service:

public class MyService extends Service { 
private static final String TAG = "Test"; 
private SensorManager mSensorManager; 
private Detector detector; 
private MyDisplayer displayer; 
private PowerManager.WakeLock wakeLock; 
private ICallback mCallback; 
private MyDisplayer.Listener mStepListener = new MyDisplayer.Listener() { 
    public void changed() { 
     passValue(); 
    } 

    public void passValue() { 
     if (mCallback != null) { 
      mCallback.changed(); 
     } 
    } 
}; 
private final IBinder mBinder = new StepBinder(); 
public static final int MyID = 1234; 
android.app.Notification Notification; 

public class StepBinder extends Binder { 
    public MyService getService() { 
     return MyService.this; 
    } 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    acquireWakeLock(); 
    displayer = new MyDisplayer(); 
    displayer.addListener(mStepListener); 
    registerDetector(); 
    startServiceNotification(); 
} 

private void registerDetector() { 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     detector = new Detector(); 
     detector.addStepListener(displayer); 
     Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(detector, mSensor, SensorManager.SENSOR_DELAY_GAME); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 


public interface ICallback { 
    void changed(); 
} 



public void registerCallback(ICallback cb) { 
    mCallback = cb; 
} 

private void startServiceNotification() { 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.logo_32) 
      .setContentTitle("Test") 
      .setPriority(Notification.PRIORITY_HIGH) 
      .setContentText("My Notif"); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    Intent resultIntent = new Intent(this, MainActivity.class); 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 
    startForeground(MyID, mBuilder.build()); 
} 

private void acquireWakeLock() { 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    int wakeFlags = PowerManager.PARTIAL_WAKE_LOCK; 
    wakeLock = pm.newWakeLock(wakeFlags, TAG); 
    wakeLock.acquire(); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 

Listener et le détecteur sont inutiles pour ce problème, donc je ne les mets pas ici. Merci pour votre aide.

+0

Nous avons exactement le même problème ici sur un P9 dans notre Voip-App (en utilisant wakelock pour sip stack). Toutes les solutions très appréciées! – Grisgram

+0

Votre service ne fonctionne-t-il pas? – W4R10CK

Répondre

0

Avez-vous essayé d'inscrire votre application parmi les applications protégées? Voir "Protected Apps" setting on Huawei phones, and how to handle it. Huawei dispose d'une fonctionnalité spéciale qui permet aux utilisateurs de sélectionner les applications qui peuvent s'exécuter en arrière-plan. Vous pouvez demander à l'utilisateur d'accepter que votre application s'exécute en arrière-plan. Apparemment, vous ne pouvez leur montrer que la page d'empilement appropriée et leur demander d'activer cette fonctionnalité. Aussi, je comprends que vous n'avez aucun moyen de savoir par programme si l'utilisateur l'a fait.

+0

Merci pour votre réponse. Cette "protéger" dans les paramètres, a travaillé pendant quelques heures, mais après, Huawei a tué l'application :) – Leo

+0

Avez-vous vu cela [http://stackoverflow.com/questions/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0] (poste)? La personne prétend que le problème est l'utilisation du wakelock. Je lui ai suggéré de l'arrêter quelques secondes. Je suis cependant en train de tester un programme similaire sans wakelock. Le téléphone ne semble pas en avoir besoin – FabioC