Привет, друг, я работаю, mp3-плеер. My Uri uri = Uri.parse ("file: ///" + song.getGetpath ());работает нормально на устройстве 6.0, но не работает на устройстве 6.0 и выше, как исправить, используя fileprovider. Я не знаю, как использовать fileprovider. Я новичок, пожалуйста, помогите здесь, мой код синтаксического анализа uri, все мои аудиофайлы находятся на моем телефонном устройстве, и он возвращает нулевой параметр.не может быть пустым Uri uri = Uri.parse ("file: ///" + song.getGetpath ());
here my class code
package music.playerforandroid;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v4.media.session.MediaSessionCompat;
import android.util.Log;
import android.view.View;
import android.Manifest;
import android.media.MediaPlayer;
import android.os.Handler;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import android.net.Uri;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RemoteViews;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.cleveroad.audiovisualization.AudioVisualization;
import com.cleveroad.audiovisualization.VisualizerDbmHandler;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import static music.playerforandroid.App.CHANNEL_ID_1;
public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private BroadcastReceiver broadcastReceiver;
private ArrayList<Song> songList;
private ListView songView;
MediaPlayer mediaPlayer;
private MediaSessionCompat mediaSession;
private int currentSongIndex = 0;
Song song;
private SlidingUpPanelLayout slidingLayout;
Context mContext;
private Utilities utils;
private int seekForwardTime = 5000; // 5000 milliseconds
private int seekBackwardTime = 5000;
private AudioVisualization audioVisualization;
private VisualizerDbmHandler handler;
int postion;
int totalduration;
int totalTime;
SeekBar seekBar;
private Handler mHandler = new Handler();
private NotificationManagerCompat notificationManager;
Uri uri;
ImageView rotate;
private long currentsongLength;
TextView elapsedTimeLabel, remainingTimeLabel;
TextView title, artist;
ImageView playchange;
ImageButton like, notlike, dislike, notdislike, next, pervious, repeat, reaptenable;
ImageButton play, pause, play_main, pause_main, shuffle, shufflenable;
private SlidingUpPanelLayout mLayout;
private boolean isShuffle;
private boolean checked;
private NotificationManagerCompat mNotificationManagerCompat;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
songView = findViewById(R.id.song_list);
songList = new ArrayList<Song>();
artist = findViewById(R.id.artist);
title = findViewById(R.id.songname);
elapsedTimeLabel = findViewById(R.id.songtime);
remainingTimeLabel = findViewById(R.id.endTime);
seekBar = findViewById(R.id.seekBar3);
next = findViewById(R.id.next);
pervious = findViewById(R.id.pervious);
like = findViewById(R.id.imageButton2);
notlike = findViewById(R.id.imageButton2new);
dislike = findViewById(R.id.button);
notdislike = findViewById(R.id.buttontwo);
play = findViewById(R.id.play_button);
repeat = findViewById(R.id.repeat);
reaptenable = findViewById(R.id.repeatenable);
pause = findViewById(R.id.pause_button);
play_main = findViewById(R.id.play_button_main);
pause_main = findViewById(R.id.pause_button_main);
like = findViewById(R.id.imageButton2);
notlike = findViewById(R.id.imageButton2new);
dislike = findViewById(R.id.button);
notdislike = findViewById(R.id.buttontwo);
play = findViewById(R.id.play_button);
pause = findViewById(R.id.pause_button);
shuffle = findViewById(R.id.shuffle);
shufflenable = findViewById(R.id.shufflenable);
elapsedTimeLabel = findViewById(R.id.endTime);
remainingTimeLabel = findViewById(R.id.songtime);
play_main = findViewById(R.id.play_button_main);
pause_main = findViewById(R.id.pause_button_main);
mLayout = findViewById(R.id.activity_main);
rotate = findViewById(R.id.rotate);
audioVisualization = findViewById(R.id.visualizer_view);
seekBar.setOnSeekBarChangeListener(this);
utils = new Utilities();
mNotificationManagerCompat = NotificationManagerCompat.from(this);
getSongList();
Collections.sort(songList, new Comparator<Song>() {
public int compare(Song a, Song b) {
return a.getTitle().compareTo(b.getTitle());
}
});
SongAdapter songAdt = new SongAdapter(this, songList);
songView.setAdapter(songAdt);
songView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, final long id) {
play(position);
}
});
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("music.playerforandroid.ACTION_PAUSE_MUSIC")) {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
rotate.clearAnimation();
}
pause.setVisibility(View.GONE);
play.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song is Pause", Toast.LENGTH_SHORT).show();
if (pause_main.getVisibility() == View.VISIBLE) {
pause_main.setVisibility(View.GONE);
play_main.setVisibility(View.VISIBLE);
}
} else if (action.equals("music.playerforandroid.ACTION_PLAY_MUSIC")) {
if (mediaPlayer == null) {
play(0);
} else {
mediaPlayer.start();
play.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song Is now Playing", Toast.LENGTH_SHORT).show();
if (play_main.getVisibility() == View.VISIBLE) {
play_main.setVisibility(View.GONE);
pause_main.setVisibility(View.VISIBLE);
Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
rotate.startAnimation(aniRotate);
}
}
} else if (action.equals("music.playerforandroid.NEXT_PLAY_MUSIC")) {
if (currentSongIndex < (songList.size() - 1)) {
play(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
} else {
// play first song
play(0);
currentSongIndex = 0;
}
} else if (action.equals("music.playerforandroid.PERVIOUS_PLAY_MUSIC")) {
if (currentSongIndex > 0) {
play(currentSongIndex - 1);
currentSongIndex = currentSongIndex - 1;
} else {
// play last song
play(songList.size() - 1);
currentSongIndex = songList.size() - 1;
}
}
}
};
repeat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
repeat.setVisibility(View.GONE);
reaptenable.setVisibility(View.VISIBLE);
shuffle.setVisibility(View.VISIBLE);
shufflenable.setVisibility(View.GONE);
isShuffle = false;
checked = true;
Toast.makeText(getApplicationContext(), "Repeat ON", Toast.LENGTH_SHORT).show();
}
});
reaptenable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
repeat.setVisibility(View.VISIBLE);
reaptenable.setVisibility(View.GONE);
checked = false;
Toast.makeText(getApplicationContext(), "Repeat OFF", Toast.LENGTH_SHORT).show();
}
});
shuffle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
reaptenable.setVisibility(View.GONE);
repeat.setVisibility(View.VISIBLE);
checked = false;
isShuffle = true;
shuffle.setVisibility(View.GONE);
shufflenable.setVisibility(View.VISIBLE);
isShuffle = true;
Toast.makeText(getApplicationContext(), "Shuffle ON", Toast.LENGTH_SHORT).show();
}
});
shufflenable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shuffle.setVisibility(View.VISIBLE);
shufflenable.setVisibility(View.GONE);
isShuffle = false;
Toast.makeText(getApplicationContext(), "Shuffle OFF", Toast.LENGTH_SHORT).show();
}
});
like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
notlike.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "You Like the Song", Toast.LENGTH_SHORT).show();
if (notdislike.getVisibility() == View.VISIBLE) {
notdislike.setVisibility(View.GONE);
}
}
});
notlike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
notlike.setVisibility(View.GONE);
}
});
dislike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
notdislike.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "You DisLike the Song", Toast.LENGTH_SHORT).show();
if (notlike.getVisibility() == View.VISIBLE) {
notlike.setVisibility(View.GONE);
}
}
});
notdislike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
notdislike.setVisibility(View.GONE);
}
});
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mediaPlayer == null) {
play(0);
} else {
mediaPlayer.start();
}
play.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song Is now Playing", Toast.LENGTH_SHORT).show();
if (play_main.getVisibility() == View.VISIBLE) {
play_main.setVisibility(View.GONE);
pause_main.setVisibility(View.VISIBLE);
Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
rotate.startAnimation(aniRotate);
}
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
rotate.clearAnimation();
}
pause.setVisibility(View.GONE);
play.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song is Pause", Toast.LENGTH_SHORT).show();
if (pause_main.getVisibility() == View.VISIBLE) {
pause_main.setVisibility(View.GONE);
play_main.setVisibility(View.VISIBLE);
}
}
});
play_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mediaPlayer == null) {
play(0);
} else {
mediaPlayer.start();
}
play_main.setVisibility(View.GONE);
pause_main.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song Is now Playing", Toast.LENGTH_SHORT).show();
if (play.getVisibility() == View.VISIBLE) {
play.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
rotate.startAnimation(aniRotate);
}
}
});
pervious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentSongIndex > 0) {
play(currentSongIndex - 1);
currentSongIndex = currentSongIndex - 1;
} else {
// play last song
play(songList.size() - 1);
currentSongIndex = songList.size() - 1;
}
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentSongIndex < (songList.size() - 1)) {
play(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
} else {
// play first song
play(0);
currentSongIndex = 0;
}
}
});
}
});
pause_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
pause_main.setVisibility(View.GONE);
play_main.setVisibility(View.VISIBLE);
Toast.makeText(MainActivity.this, "Song is Pause", Toast.LENGTH_SHORT).show();
if (pause.getVisibility() == View.VISIBLE) {
pause.setVisibility(View.GONE);
play.setVisibility(View.VISIBLE);
rotate.clearAnimation();
}
}
});
}
@Override
public void onBackPressed() {
if (mLayout != null &&
(mLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED || mLayout.getPanelState() == SlidingUpPanelLayout.PanelState.ANCHORED)) {
mLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
} else {
super.onBackPressed();
}
}
public void getSongList() {
//retrieve song info
ContentResolver musicResolver = getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if (musicCursor != null && musicCursor.moveToFirst()) {
//get columns
int titleColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);
int dataColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.DATA);
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
String thisPath = musicCursor.getString(dataColumn);
songList.add(new Song(thisId, thisTitle, thisArtist, thisPath));
}
while (musicCursor.moveToNext());
}
}
public void play(int songindex) {
song = songList.get(songindex);
try {
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
//file:///" + song.getGetpath()
// final Uri data = FileProvider.getUriForFile(this, "myprovider", new File(song.getGetpath()));
Toast.makeText(getApplicationContext(), ""+uri, Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse("file:///"+song.getGetpath());
mediaPlayer = MediaPlayer.create(mContext, uri);
title.setText(song.getTitle());
artist.setText(song.getArtist());
show();
handler = VisualizerDbmHandler.Factory.newVisualizerHandler(getApplicationContext(), mediaPlayer);
audioVisualization.linkTo(handler);
mediaPlayer.start();
seekBar.setProgress(0); seekBar.setMax(100);
updateProgressBar();
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
play.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
play_main.setVisibility(View.GONE);
pause_main.setVisibility(View.VISIBLE);
Animation aniRotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate);
rotate.startAnimation(aniRotate);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (checked) {
mediaPlayer.setLooping(true);
mediaPlayer.start();
} else if (isShuffle) {
// shuffle is on - play a random song
Random rand = new Random();
currentSongIndex = rand.nextInt((songList.size() - 1) - 0 + 1) + 0;
play(currentSongIndex);
} else {
// no repeat or shuffle ON - play next song
if (currentSongIndex < (songList.size() - 1)) {
play(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
} else {
// play first song
play(0);
currentSongIndex = 0;
}
}
}
});
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "" + e, Toast.LENGTH_SHORT).show();
}
}
public void forward() {
int currentPosition = mediaPlayer.getCurrentPosition();
// check if seekForward time is lesser than song duration
if (currentPosition + seekForwardTime <= mediaPlayer.getDuration()) {
// forward song
mediaPlayer.seekTo(currentPosition + seekForwardTime);
} else {
// forward to end position
mediaPlayer.seekTo(mediaPlayer.getDuration());
}
}
public void backword() {
int currentPosition = mediaPlayer.getCurrentPosition();
// check if seekBackward time is greater than 0 sec
if (currentPosition - seekBackwardTime >= 0) {
// forward song
mediaPlayer.seekTo(currentPosition - seekBackwardTime);
} else {
// backward to starting position
mediaPlayer.seekTo(0);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
mediaPlayer.release();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "" + e, Toast.LENGTH_SHORT).show();
}
}
public void updateProgressBar() {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long totalDuration = mediaPlayer.getDuration();
long currentDuration = mediaPlayer.getCurrentPosition();
// Displaying Total Duration time
remainingTimeLabel.setText("" + utils.milliSecondsToTimer(totalDuration));
// Displaying time completed playing
elapsedTimeLabel.setText("" + utils.milliSecondsToTimer(currentDuration));
// Updating progress bar
int progress = (int) (utils.getProgressPercentage(currentDuration, totalDuration));
//Log.d("Progress", ""+progress);
seekBar.setProgress(progress);
// Running this thread after 100 milliseconds
mHandler.postDelayed(this, 100);
}
};
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(mUpdateTimeTask);
int totalDuration = mediaPlayer.getDuration();
int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);
// forward or backward to certain seconds
mediaPlayer.seekTo(currentPosition);
// update timer progress again
updateProgressBar();
}
@Override
protected void onStart() {
super.onStart();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("music.playerforandroid.ACTION_PAUSE_MUSIC");
intentFilter.addAction("music.playerforandroid.ACTION_PLAY_MUSIC");
intentFilter.addAction("music.playerforandroid.NEXT_PLAY_MUSIC");
intentFilter.addAction("music.playerforandroid.PERVIOUS_PLAY_MUSIC");
registerReceiver(broadcastReceiver,intentFilter);
}
public void show(){
Bitmap largeImage = BitmapFactory.decodeResource(getResources(),R.drawable.musicicon);
PendingIntent pausePendingIntent = PendingIntent.getBroadcast(this, 1, new Intent("music.playerforandroid.ACTION_PAUSE_MUSIC"), 0);
PendingIntent playPendingIntent = PendingIntent.getBroadcast(this, 1, new Intent("music.playerforandroid.ACTION_PLAY_MUSIC"), 0);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 1, new Intent("music.playerforandroid.NEXT_PLAY_MUSIC"), 0);
PendingIntent perviousPendingIntent = PendingIntent.getBroadcast(this, 1, new Intent("music.playerforandroid.PERVIOUS_PLAY_MUSIC"), 0);
Notification channel = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID_1)
.setSmallIcon(R.drawable.ic_music)
.setContentTitle(song.getTitle())
.setContentText(song.getArtist())
.setLargeIcon(largeImage)
.addAction(R.drawable.ic_prev, "prev", perviousPendingIntent)
.addAction(R.drawable.ic_play, "play", playPendingIntent)
.addAction(R.drawable.ic_stat_name, "pause", pausePendingIntent)
.addAction(R.drawable.ic_next, "next", nextPendingIntent)
.setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle().
setShowActionsInCompactView(1, 2, 3))
.build();
mNotificationManagerCompat.notify(1, channel);
}
}