невозможно воспроизвести метод потокового запуска android - PullRequest
0 голосов
/ 30 апреля 2020

Я разработчик приложений для платформы Android. Теперь я хочу, чтобы когда приложение начало автоматически воспроизводить музыку c из потоковой передачи, к сожалению, я не могу этого сделать, у меня есть условие, которое проверяет, если музыка c на фоне, но это не работает, потому что приложение начинает потоковую передачу Musi c, но когда я хочу остановить его, он запускает Musi c и потоковый поток двойной.

    playStop = findViewById(R.id.playStopBtn);
    nowPlaying = findViewById(R.id.radioStationNowPlaying);
    nowPlaying.setTypeface(dorcic);
    setIsPlaying(false);
    processPhoneListenerPermission();
    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
            if (tm != null) {
                if (tm.getCallState() == TelephonyManager.CALL_STATE_RINGING) {
                    if (getIsPlaying()) {
                        stop();
                    }
                }
            }
        }
    };
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.PHONE_STATE");
    registerReceiver(broadcastReceiver, filter);
    loadNowPlaying();
    playStop.setOnClickListener(view -> {
        if (isNetworkAvailable()) {
            if (getIsPlaying()) {
                stop();
            } else {
                play();
            }
        } else {
            Toast.makeText(getApplicationContext(), "No internet", Toast.LENGTH_LONG).show();
        }
    });
}




private void loadNowPlaying() {
    Thread t = new Thread() {
        public void run() {
            try {
                while (!isInterrupted()) {
                    runOnUiThread(() -> reloadShoutCastInfo());
                    Thread.sleep(20000);
                }
            } catch (InterruptedException ignored) {
            }
        }
    };
    t.start();
}

private void reloadShoutCastInfo() {
    if (isNetworkAvailable()) {
        AsyncTaskRunner runner = new AsyncTaskRunner();
        runner.execute();
    }
}

@SuppressLint("StaticFieldLeak")
private class AsyncTaskRunner extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
        mmr.setDataSource(STREAMING_URL);
        nowPlayingData = mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ICY_METADATA).replaceAll("StreamTitle", "").replaceAll("[=,';]+", "");
        mmr.release();
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        nowPlaying.setText(nowPlayingData);
    }
}

private void processPhoneListenerPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 121);
    }
}

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = null;
    if (cm != null) {
        networkInfo = cm.getActiveNetworkInfo();
    }
    return networkInfo != null && networkInfo.isConnectedOrConnecting();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == 121) {
        if (!(grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
            Toast.makeText(getApplicationContext(), "Permission not granted.\nWe can't pause music when phone ringing.", Toast.LENGTH_LONG).show();
        }
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

    @Override
    public void onBackPressed()
    {
        Toast.makeText(MainActivity.this,"לחצו על כפתור הבית לשמיעת הרדיו ברקע", Toast.LENGTH_LONG).show();

    }

private void setIsPlaying(boolean status) {
    SharedPreferences.Editor editor = getApplicationContext().getSharedPreferences("isPlaying", MODE_PRIVATE).edit();
    editor.putBoolean("isPlaying", status);
    editor.apply();
}

private boolean getIsPlaying() {
    SharedPreferences prefs = getApplicationContext().getSharedPreferences("isPlaying", MODE_PRIVATE);
    return prefs.getBoolean("isPlaying", false);
}

private void play() {
    setIsPlaying(true);
    Intent servicePlayIntent = new Intent(this, MyService.class);
    servicePlayIntent.putExtra("playStop", "play");
    startService(servicePlayIntent);
    playStop.setImageResource(R.drawable.ic_pause);
    Toast.makeText(getApplicationContext(), "מתנגן...", Toast.LENGTH_LONG).show();
}

private void stop() {
    setIsPlaying(false);
    Intent serviceStopIntent = new Intent(this, MyService.class);
    serviceStopIntent.putExtra("playStop", "stop");
    startService(serviceStopIntent);
    playStop.setImageResource(R.drawable.ic_play);
    Toast.makeText(getApplicationContext(), "עוצר...", Toast.LENGTH_LONG).show();
}

@Override
protected void onStop() {
    super.onStop();

}

@Override
protected void onStart() {
    play();
    super.onStart();
}

@Override
protected void onDestroy() {
    stopService(new Intent(getApplicationContext(), MyService.class));
    unregisterReceiver(broadcastReceiver);
    finish();
    super.onDestroy();
}

}

1 Ответ

0 голосов
/ 30 апреля 2020

Попробуйте определить это:

Thread t = new Thread ()

как переменная для полного класса, а не только для внутреннего метода

, и это должно сработать

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