我正在开发一个应用程序流,每当选择了一首新歌,对于当前正在播放的歌曲,然后将服务应用程序与用户选择的新曲再次启动它,但是,这工作完全在我的手机(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()方法中,因为它负责在有新歌曲时“重置”服务。我没有在代码中看到任何错误,更不用说其他方法了,这样我就可以解决这个问题。如果有人对如何以适用于所有设备的方式重置服务有其他想法,我将接受。回顾该应用程序可用于Android上来自SKD 22的应用程序。