2016-10-20 6 views
7

मैं एंड्रॉइड के लिए ऐप विकसित करने का प्रयास करता हूं जो फोन के एक्सेलेरोमीटर का उपयोग करता है। यह हूवेई के फोन (पी 9 पर परीक्षण) को छोड़कर हर जगह काम करता है। मैंने "ब्लैक स्क्रीन के साथ चलते रहें" विकल्प को चेक किया और बैटरी सेवर (बैटरी का विकल्प) के साथ एप्लिकेशन की रक्षा की।मेरा हुआवेई मेरी वाकेलॉक एंड्रॉइड ऐप को मारता है

मैं समाधान नहीं देख सकते हैं, तो मैं आप के लिए पूछना :-) यह मेरा गतिविधि है:

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); 
} 

और मेरी सेवा:

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; 
} 

श्रोता और डिटेक्टर के लिए बेकार हैं यह समस्या इसलिए मैं उन्हें यहां नहीं डालता। आपकी मदद के लिए धन्यवाद।

+0

हमारे पास हमारे वीओआईपी-एप (पीप स्टैक के लिए वाकेलॉक का उपयोग करके) में पी 9 पर एक ही समस्या है। किसी भी समाधान की अत्यधिक सराहना की! – Grisgram

+0

क्या आपकी सेवा नहीं चल रही है? आपके उत्तर के लिए – W4R10CK

उत्तर

0

क्या आपने सुरक्षित ऐप के बीच अपना ऐप सूचीबद्ध करने का प्रयास किया है? "Protected Apps" setting on Huawei phones, and how to handle it देखें। Huawei एक विशेष सुविधा है जो उपयोगकर्ताओं को यह चुनने की अनुमति देती है कि कौन से अनुप्रयोग पृष्ठभूमि में चल सकते हैं। आप उपयोगकर्ता से यह स्वीकार करने के लिए कह सकते हैं कि आपका ऐप पृष्ठभूमि में चलता है। जाहिर है हालांकि आप उन्हें केवल उचित स्टेटिंग पेज दिखा सकते हैं और पूछ सकते हैं कि वे इस सुविधा को स्वयं सक्षम करते हैं। साथ ही मैं समझता हूं कि यदि उपयोगकर्ता ने ऐसा किया है तो प्रोग्रामेटिक रूप से जानने का कोई तरीका नहीं है।

+0

Thx। सेटिंग में यह "सुरक्षा", कुछ घंटों तक काम करता था लेकिन बाद में, हुआवेई ने ऐप को मार दिया :) – Leo

+0

क्या आपने इसे देखा है [http://stackoverflow.com/questions/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0] (पोस्ट)? व्यक्ति का दावा है कि यह मुद्दा वाकलोक का उपयोग है। मैंने उसे कुछ सेकंड के लिए रोकने के लिए सुझाव दिया। हालांकि मैं एक वैकेलॉक के बिना एक समान कार्यक्रम का परीक्षण कर रहा हूं। फोन की आवश्यकता नहीं है – FabioC

संबंधित मुद्दे