Воспроизведение нескольких звуков с помощью нескольких кнопок из необработанного в фоновом режиме с помощью сервиса - PullRequest
0 голосов
/ 10 января 2019

Я хочу воспроизвести 6 различных звуков, запускаемых 6 различными кнопками в фоновом режиме, чтобы, если приложение находилось в фоновом режиме, звук продолжал воспроизводиться. Когда один звук уже воспроизводится, нажатие другой кнопки останавливает его и воспроизводит собственный звук, Нажатие на одну и ту же кнопку 2K раз останавливается, 2K + 1 раз: начинается снова .. (K - ненулевое целое число)

Весь код выполнен и, кажется, работает правильно, за исключением того, что проигрыватель останавливается через полторы минуты. (Это не из-за нехватки памяти) Может кто-нибудь сказать, пожалуйста, что я делаю не так?

public class PlayService extends Service {

    private MediaPlayer player;

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

    @Override
    public void onCreate() {

        super.onCreate();
        player = new MediaPlayer();

    }

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

        int btnId = intent.getExtras().getInt("ID");

        Toast.makeText(this, "onStart service" + btnId, Toast.LENGTH_SHORT).show();

        selectResId(btnId);

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_SHORT).show();
        if (player != null) {
            player.stop();
            player.release();
        }
        player = null;
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Toast.makeText(this, "Low mem", Toast.LENGTH_SHORT).show();
    }

    private void selectResId(int resId){
        switch (resId){
            case 1: playMediaFromResource(R.raw.number_one);
            case 2: playMediaFromResource(R.raw.number_two);
            case 3: playMediaFromResource(R.raw.number_three);
            case 4: playMediaFromResource(R.raw.number_four);
            case 5: playMediaFromResource(R.raw.number_five);
            case 6: playMediaFromResource(R.raw.number_six);
            default: break;
        }
    }

    private void playMediaFromResource(int resId) {
        Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + resId);
        try {
            player.setDataSource(getApplicationContext(), mediaPath);
            player.setLooping(true);
            player.prepare();
            player.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

И MainActivity:

public class MainActivity extends AppCompatActivity {

    private Button btnStart1;
    private Button btnStart2;
    private Button btnStart3;
    private Button btnStart4;
    private Button btnStart5;
    private Button btnStart6;
    private Intent intent;

    private int previousID = 0;


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

        findViewsByIds();
        setOnClickListeners();

    }


    private void findViewsByIds() {

        btnStart1 = findViewById(R.id.btn_start_1);
        btnStart2 = findViewById(R.id.btn_start_2);
        btnStart3 = findViewById(R.id.btn_start_3);
        btnStart4 = findViewById(R.id.btn_start_4);
        btnStart5 = findViewById(R.id.btn_start_5);
        btnStart6 = findViewById(R.id.btn_start_6);

    }

    private void setOnClickListeners() {

        btnStart1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(1);

            }
        });

        btnStart2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(2);

            }
        });

        btnStart3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(3);

            }
        });

        btnStart4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(4);

            }
        });

        btnStart5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(5);

            }
        });

        btnStart6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkIntentState(6);

            }
        });
    }

    private void checkIntentState(int ID) {
        if (intent == null) {
            createNewIntent(ID);
        } else {
            stopService(intent);
            intent = null;
            if (ID != previousID) {
                createNewIntent(ID);
            }
        }
    }


    private void createNewIntent(int ID) {
        intent = new Intent(MainActivity.this, PlayService.class);
        intent.putExtra("ID", ID);
        startService(intent);
        previousID = ID;

    }
}

1 Ответ

0 голосов
/ 10 января 2019

Я хочу ответить на свой вопрос на случай, если кто-нибудь еще столкнется с проблемой. Оказывается, в Android добавлены некоторые новые функции (ограниченный доступ к фоновым ресурсам для улучшения времени автономной работы со времен Oreo (т.е. Android 8.0+ || API level 26)).

Как сказано в документации: «Приложения, работающие в фоновом режиме, теперь имеют ограничения на свободный доступ к фоновым службам».

Итак, в этом случае нам нужно будет использовать службы переднего плана.

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