Как передать данные медиаплеера из сервиса во фрагмент за android - PullRequest
0 голосов
/ 09 июля 2020

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

Вот мое основное действие 1-я фотография

Вот моя фрагмент после касания поля на 1-й фотографии фрагмент

Мой код в MainActivity

public class MainActivity extends AppCompatActivity {

private List<AudioModel> mainList;
private ListView mainListView;
private MusicAdapter adapter;
private int REQUEST_CODE_PERMISSION = 2703;
private MusicPlayerService musicPlayerService;
public static Intent intentService;
private boolean boundService = false;
public static TextView txtMainTen, txtMainTacGia;
private ImageButton btnMainPlay, btnMainNext;
private int vitri = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainList = new ArrayList<>();
    if(intentService == null){
        intentService = new Intent(this, MusicPlayerService.class);
        bindService(intentService, serviceConnection, Context.BIND_AUTO_CREATE);
        startService(intentService);
    }
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);

    mainListView = findViewById(R.id.listSong);
    adapter = new MusicAdapter(MainActivity.this, R.layout.item_song, mainList);
    mainListView.setAdapter(adapter);

    mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            MainAudioCreate(position);
            vitri = position;
        }
    });
    txtMainTen = findViewById(R.id.txtPlaying);
    txtMainTacGia = findViewById(R.id.txtAuthor);
    btnMainPlay = findViewById(R.id.btnPlayBottom);
    btnMainNext = findViewById(R.id.btnNextBottom);

    btnMainPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (musicPlayerService.mediaPlayer.isPlaying()){
                musicPlayerService.pause();
                btnMainPlay.setImageResource(R.drawable.button_play);
            }
            else{
                musicPlayerService.resume();
                btnMainPlay.setImageResource(R.drawable.button_pause);
            }
        }
    });

    btnMainNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            vitri++;
            if (vitri > mainList.size() - 1){
                vitri = 0;
            }
            MainAudioCreate(vitri);
        }
    });
}

private void MainAudioCreate(int position){
    musicPlayerService.setVitri(position);
    musicPlayerService.play();
    btnMainPlay.setImageResource(R.drawable.button_pause);
    txtMainTen.setText(musicPlayerService.serviceList.get(position).getName());
    txtMainTacGia.setText(musicPlayerService.serviceList.get(position).getArtist());
}

public void AddFragment(View view){
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment fragment = null;
    int container = 0;
    String tag = "";

    switch (view.getId()) {
        case R.id.layoutClose:
            fragment = new FragmentClose();
            container = R.id.frameContent;
            tag = "fragClose";
            break;
        case R.id.layoutList:
            fragment = new FragmentPlaylist();
            container = R.id.frameContent;
            tag = "fragList";
            break;
        case R.id.bottomPlayerTouchable:
            fragment = new FragmentPlayer();
            container = R.id.mainFrame;
            tag = "fragPlayer";
            break;
    }

    fragmentTransaction.add(container, fragment, tag);
    fragmentTransaction.addToBackStack("fragment");
    fragmentTransaction.commit();
}
public void GetSongFromStorage(Context context, List<AudioModel> list){
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    String[] projection = {MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE,};
    Cursor c = context.getContentResolver().query(uri, projection, null, null, MediaStore.Audio.Media.TITLE + " ASC");

    if (c != null){
        while (c.moveToNext()) {

            AudioModel audioModel = new AudioModel();
            String path = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
            mmr.setDataSource(path);
            String album = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
            String artist = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
            String name = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
            byte[] image = mmr.getEmbeddedPicture();

            String displayName = path.substring(path.lastIndexOf("/") + 1);

            audioModel.setName(name);
            audioModel.setAlbum(album);
            audioModel.setArtist(artist);
            audioModel.setPath(path);
            audioModel.setDisplayname(displayName);
            if (image != null) audioModel.setImgPath(image);

            list.add(audioModel);
        }
        adapter.notifyDataSetChanged();
        c.close();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_PERMISSION){
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            mainList.clear();
            GetSongFromStorage(MainActivity.this, mainList);
        }
        else{
            Toast.makeText(this, "Chưa cho phép", Toast.LENGTH_SHORT).show();
        }
    }
}

private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MusicPlayerService.MusicBinder binder = (MusicPlayerService.MusicBinder) service;
        musicPlayerService = binder.getService();
        musicPlayerService.setList(mainList);
        boundService = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        boundService = false;
    }
};

}

Мой код услуги

public class MusicPlayerService extends Service {

MediaPlayer mediaPlayer;
List<AudioModel> serviceList;
int vitri;

private final IBinder musicBind = new MusicBinder();

public class MusicBinder extends Binder {
    MusicPlayerService getService(){
        return MusicPlayerService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    mediaPlayer.stop();
    mediaPlayer.release();
    return false;
}

public void initMusicPlayer(){
    mediaPlayer.setWakeMode(getApplicationContext(),
            PowerManager.PARTIAL_WAKE_LOCK);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}

@Override
public void onCreate() {
    super.onCreate();
    vitri = 0;
    mediaPlayer = new MediaPlayer();
    
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

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

public void setList(List<AudioModel> mp3List){
    serviceList = mp3List;
}

public void play(){
    mediaPlayer.reset();
    createSong();
}
public void pause(){
    mediaPlayer.pause();
}
public void resume(){
    mediaPlayer.start();
}

public void createSong(){
    mediaPlayer = MediaPlayer.create(this, Uri.parse(serviceList.get(vitri).getPath()));
    mediaPlayer.start();
}
public void setVitri(int pos){
    vitri = pos;
}

}

Мой фрагмент, который будет добавлен в код

public class FragmentPlayer extends Fragment {
ImageButton btnBackPlayer;
TextView txtTitlePlayer, txtTimeCurrent, txtTimeTotal;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_player, container, false);
    btnBackPlayer = view.findViewById(R.id.btnBackPlayer);
    txtTitlePlayer = view.findViewById(R.id.txtTitlePlayer);
    txtTimeCurrent = view.findViewById(R.id.txt_timeCurrent);
    txtTimeTotal = view.findViewById(R.id.txt_timeTotal);

    view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

    btnBackPlayer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getFragmentManager().popBackStack();
        }
    });
    return view;
}

}

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете использовать трансляцию в своем сервисе и установить слушателя трансляции в своем фрагменте.

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