Приложение 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
}
}
У меня нет сообщений об ошибках, я вижу только, что система засыпает, если телефонный звонокразмещены