Как я могу запустить свое приложение Android, обнаружив дрожание с помощью службы переднего плана для уровня API выше 27? - PullRequest
0 голосов
/ 13 июля 2020

Я использую службу переднего плана в своем приложении для обнаружения встряхивания и запуска приложения из любого места в MainActivity. После выполнения некоторого кода теперь я застрял с проблемой. Я надеюсь, что кто-нибудь найдет решение или подскажет, как это сделать. Да, я запускал приложение, после того, как каждый раз, когда я встряхиваю телефон, запускаю сервис, приложение закрывается автоматически. Мой сервисный код приведен ниже

public class ExampleService extends Service {
    private SensorManager sensorManager;
    private float acelVal;
    private float acelLast;
    private float shake;

    public ExampleService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();




    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {




        Intent notificationIntent=new Intent(this,MainActivity.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);

        Notification notification=new NotificationCompat.Builder(this,CHANNEL_ID)
                .setContentTitle("Example service")
                .setContentText("Example for shaking")
                .setSmallIcon(R.drawable.ic_android)
                .setContentIntent(pendingIntent)
                .build();



        sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
        sensorManager.registerListener(sensorListener,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
        acelVal=SensorManager.GRAVITY_EARTH;
        acelLast=SensorManager.GRAVITY_EARTH;
        shake=0.00f;

        startForeground(1,notification);

        return START_NOT_STICKY;
    }

    public final SensorEventListener sensorListener= new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            float x=sensorEvent.values[0];
            float y=sensorEvent.values[1];
            float z=sensorEvent.values[2];

            acelLast=acelVal;
            acelVal=(float)Math.sqrt((double)(x*x+y*y+z*z));
            float delta=acelVal-acelLast;
            shake=shake*0.9f+delta;

            if(shake>12)
            {
                Intent intent= new Intent(ExampleService.this,MainActivity.class);
                startActivity(intent);
            }

        }

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

        }
    };

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

И код MainActivity:

public class MainActivity extends AppCompatActivity {

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



        Intent intent=new Intent(this,ExampleService.class);
        startForegroundService(intent);

    }

}

Я на правильном пути, чтобы достичь этого? Если нет, подскажите, как это решить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...