Я разрабатываю потоковое приложение, и всякий раз, когда выбирается новая песня, приложение для службы, которая воспроизводит текущую песню, а затем запускает ее снова с новой песней, выбранной пользователем, однако это отлично работает на моем телефон (Moto G7 Play, Android 10), если я использую то же приложение на другом телефоне (Moto G7 Play, Android 10), то есть на другом телефоне, точно таком же, как мой, это больше не работает. Я понимаю, что проблема в том, что в другой ячейке stopService () не работает по какой-то причине, но в моей ячейке он работает, что приводит меня в замешательство, потому что как что-то может работать идеально в моей ячейке, а не в другой? Я попытался посмотреть в logcat, и он отображается одинаково на обоих телефонах, но на другом телефоне (не моем) иногда появляется сообщение о незарегистрированной службе, но все же stopService () по-прежнему не работает.
Мой код:
private boolean mBound = false;
private SimpleExoPlayer player;
private PlayerView playerView;
private PlayerControlView mPlayerControl;
private AudioPlayerService mService;
final Handler handler = new Handler();
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
AudioPlayerService.LocalBinder binder = (AudioPlayerService.LocalBinder) service;
mService = binder.getService();
mBound = true;
inicializarExoPlayer();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
}
};
@SuppressLint({"ClickableViewAccessibility", "CutPasteId"})
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
// ATTENTION: This was auto-generated to handle app links.
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
if (appLinkIntent != null) {
try {
params = appLinkData.getPathSegments();
String id = params.get(params.size() - 1);
firebaseFirestore.collection("musicas").document(id)
.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
SharedPreferences.Editor editor = getSharedPreferences("NomeAutorForNotification", MODE_PRIVATE).edit();
editor.putString("link_imagem", documentSnapshot.getString("link_imagem"));
editor.putString("nome_musica", documentSnapshot.getString("nome_musica"));
editor.putString("autor_musica", documentSnapshot.getString("autor"));
editor.putString("id_musica", documentSnapshot.getString("music_id"));
editor.putString("link_musica", documentSnapshot.getString("link_musica"));
editor.putString("aid", documentSnapshot.getString("aid"));
editor.apply();
inicializarPlayerActivity();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(PlayerActivity.this, "Ocorreu um erro!", Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
e.printStackTrace();
inicializarPlayerActivity();
}
}
}
private void inicializarPlayerActivity() {
editor = getSharedPreferences("NomeAutorForNotification", Context.MODE_PRIVATE);
link_imagem = editor.getString("link_imagem", null);
nome_musica = editor.getString("nome_musica", null);
autor_musica = editor.getString("autor_musica", null);
id_musica = editor.getString("id_musica", null);
link_musica = editor.getString("link_musica", null);
aid = editor.getString("aid", null);
try {
musicPropertiesBackup = getSharedPreferences("MusicPropertiesBackup", MODE_PRIVATE);
link_imagem_backup = musicPropertiesBackup.getString("link_imagem", null);
System.out.println("Link Imagem é: " + link_imagem_backup);
if (link_imagem_backup != null && link_imagem_backup.equals(link_imagem)) {
System.out.println("A música ecexutada é a mesma!");
if (sharedPreferences.getString("initialize_player_before_exit", null) != null &&
sharedPreferences.getString("initialize_player_before_exit", null).equals("ok")) {
inicializarNovaMusica();
} else {
bindService(intent, mConnection, BIND_AUTO_CREATE);
inicializarExoPlayer();
}
} else {
System.out.println("A música executada não é a mesma!");
SharedPreferences.Editor editor = getSharedPreferences("MusicPropertiesBackup", MODE_PRIVATE).edit();
editor.putString("link_imagem", link_imagem);
editor.apply();
inicializarNovaMusica();
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Não há nenhum link de backup salvo!");
SharedPreferences.Editor editor = getSharedPreferences("MusicPropertiesBackup", MODE_PRIVATE).edit();
editor.putString("link_imagem", link_imagem);
editor.apply();
}
Picasso.get()
.load(link_imagem)
.into(imageMusica);
nomeMusica.setText(nome_musica);
autorMusica.setText(autor_musica);
mDocUserRef = FirebaseFirestore.getInstance().collection("usuarios").document(userId)
.collection("user_propriedades").document("propriedades").collection("favoritos")
.document(id_musica);
mDocUserRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
favoriteReference = documentSnapshot.getString("music_id");
starFav.setImageResource(R.drawable.ic_baseline_star_fav);
fav = true;
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("Não foi possível encontrar suas músicas favoritas");
}
});
}
private void inicializarExoPlayer() {
if (mBound) {
player = mService.getPlayerInstance();
playerView.setPlayer(player);
mPlayerControl.setPlayer(player);
addToRecent();
}
}
private void inicializarNovaMusica() {
stopService(intent);
bindService(intent, mConnection, BIND_AUTO_CREATE);
Util.startForegroundService(PlayerActivity.this, intent);
inicializarExoPlayer();
addViews();
SharedPreferences.Editor editor = getSharedPreferences("Preferences", MODE_PRIVATE).edit();
editor.putString("initialize_player_before_exit", null);
editor.apply();
}
StopService () находится в методе initializeNovaMusica (), так как он отвечает за «сброс» службы при появлении новой песни. Я не вижу ошибок в коде, не говоря уже об альтернативе, чтобы я мог решить эту проблему. Если у кого-то есть другая идея о том, как сбросить службу таким образом, чтобы она работала на всех устройствах, я соглашусь. Напомним, что приложение доступно для приложений со SKD 22 на Android.