Wakelock потерян после намерения телефонного звонка - PullRequest
0 голосов
/ 09 октября 2019

Приложение Android Java, разработанное в Android Studio, должно отслеживать местоположение GPS и вызывать номер телефона, чтобы вызвать уличный барьер. Приложение использует SCREEN_DIM_WAKE_LOCK для поддержания работоспособности устройства, которое работает нормально. Я использую намерение ACTION_CALL для вызова барьера, который также работает. Проблема, которую нужно решить: после завершения звонка функция пробуждения больше не работает, и устройство засыпает примерно через 10-20 секунд. Устройство НЕ засыпает, когда нет намерения вызова, поэтому я уверен, что это связано с намерением телефонного вызова. Отслеживание местоположения gps выполняется с помощью внутреннего закрытого класса, который реализует прослушиватель местоположения. Слушатель местоположения создает экземпляр нового класса, производного от ASyncTask, для публикации данных gps в веб-интерфейсе и проверки геозон, то есть: выполнить вызов.

Я попытался добавить флаги, такие как FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_CLEAR_TOP,Я также поместил singleTop launchMode в Manifest для MainActivity, но пока не могу найти решение.

public class MainActivity extends AppCompatActivity {

private LocationManager locationManager;
private LocationListener locationListener;
protected static PowerManager.WakeLock mWakeLock;
protected Handler stopCallHandler = new Handler();


@Override
protected void onCreate(Bundle savedInstanceState) {
  final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
  mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp:KeepDeviceAwake");
  this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  this.locationListener = new MyLocationListener();
}

public void callPhoneNumber(String number) {
  Intent intent = new Intent(Intent.ACTION_CALL);
  intent.setData(Uri.parse("tel:" + number));
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  this.startActivity(intent);
  // Kill the Call after x seconds
  stopCallHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
      stopCall();
    }
  }, 5000);
}

private class LocationChangedTasks extends AsyncTask<Location, String, Void> {
  @Override
  protected Void doInBackground(Location... locations) {
    // Post location data to internet api for geotracking vehicle (therefore, asynctask is used)
    // get location and check if current location is in geofence
    // if yes, place call
    callPhoneNumber(number);
  }
}

private class MyLocationListener implements LocationListener {
  @Override
  public void onLocationChanged(Location loc) {
    LocationChangedTasks locationchangedtask = new LocationChangedTasks();
    locationchangedtask.execute(loc);
  }
}

public void stopCall() {
  // Uses code from
  // /478333/kak-povesit-ishodyaschii-zvonok-v-android
  // to kill the call
}

}

У меня нет сообщений об ошибках, я вижу только, что система засыпает, если телефонный звонокразмещены

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

это происходит потому, что, пока ваша активность возвращается на круги своя, стэк Back будет очищен, но когда вы вернетесь к своей активности, он не будет воссоздан. поэтому для этого добавьте их в свой AndroidManifest.xml

 <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
        android:autoRemoveFromRecents="true" />

, это поможет сохранить вашу активность в фоновом режиме, пока вы не вызовете finish ();

, а также включает функции, которые необходимо вызвать при перезапуске вашей деятельности, внутри

onResume ()

@Override
protected void onResume() {
        super.onResume();
        otected void onCreate(Bundle savedInstanceState) {
        final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"MyApp:KeepDeviceAwake");
        this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        this.locationListener = new MyLocationListener();
    } 
0 голосов
/ 09 октября 2019

Вы можете попробовать это, чтобы избежать засыпания экрана:

1) В AndroidManifest.xml

<activity
     android:name=".MainActivity"
     android:turnScreenOn="true"
     ...>
.......

2) В MainActivity.java

@Override
protected void onResume() {
    super.onResume();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
...