I\'m developing a video streaming application and I\'m getting stuck when calling set setDataSource with a FileDescriptor. I want my application to play the video as it is b
having the same error, and having read the answer above on file format, I abandonded trying to setDataSource with my .mov file and instead created a video with my Android Telefon Camera which gave me an .mp4 file. I put this in the directory Pictures/. This worked - I cound setDataSource without errors. I hope this is useful to someone.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyDirectoryUnderPictures");
File mediaFile_mp4_android;
mediaFile_mp4_android = new File(mediaStorageDir.getPath()
+ File.separator
+ "mp4_test"
+ ".mp4"); //video taken with android camera
String filePath_mp4_android = String.valueOf(mediaFile_mp4_android);
File file_mp4_android = new File(filePath_mp4_android);
Uri contentUri = Uri.fromFile(file_mp4_android);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(String.valueOf(contentUri));
If you're targeting Marshmallow or greater, make sure that you have requested the Manifest.permission.WRITE_EXTERNAL_STORAGE
permission properly. I tried many different solutions, including another library that's an alternative to MediaMetadataRetriever
, but it turned out that one of my code paths didn't request the proper permission.
Okay, I've arrived to the conclusion that errors like:
Prepare failed.: status=0x1 (when calling prepare() )
and
setDataSourceFD failed.: status=0x80000000 (when calling setDataSourceFD() )
have to do with the file format and probably mean that the file is incomplete, corrupted or something like that...
As I have post in this link, I've found an specific video which works fine while streaming it (though I use setDataSource
, not setDataSourceFD
), but it'll not work with most of the videos.
I agree with Pedriyoo, I tried reproducing the exception with different video file formats and out of the following video formats: AVI, MPG/MPEG, MOV, mov, mp4, m4v, flv, WMV, I noticed that AVI, MPG/MPEG, and WMV threw an exception for me every time. Better to exclude them before running the method and wrap it with a try-catch.
I also have that problem. When I select the audio from SDCard by library it works, and if I press stop and start again, too. But when restarting the app, and I play without open library, only with url saved, it stops working, and returns that error: 'java.io.IOException: setDataSource failed.: status=0x80000000'
Global Vars:
MediaPlayer media = new MediaPlayer();
TextView idenss;
static private int PICKFILE_RESULT_CODE = 1;
Boolean selectusicFromBworser = false;
Button playGlobal;
My code dialog:
private void viewDialogSounds(final Button sountlabel){
final View dialogView = View.inflate(this, R.layout.dialoge_selectsouns, null);
final androidx.appcompat.app.AlertDialog alertDialog = new androidx.appcompat.app.AlertDialog.Builder(this).create();
alertDialog.setTitle(context.getString(R.string.sound));
Button exitW, play, pause, sound_set;
ListView listsounds;
SoundSteucture strAdapHistory = new SoundSteucture();
ArrayList<SoundSteucture> structureHistoryArr;
SoundAdapter _adapterHistory = null;
final TextView fileSelectedName;
exitW = (Button) dialogView.findViewById(R.id.exitW);
play = (Button) dialogView.findViewById(R.id.play);
pause = (Button) dialogView.findViewById(R.id.pause);
sound_set = (Button) dialogView.findViewById(R.id.sound_set);
listsounds = (ListView) dialogView.findViewById(R.id.listsounds);
fileSelectedName = (TextView) dialogView.findViewById(R.id.fileSelectedName);
idenss = fileSelectedName;
playGlobal = play;
structureHistoryArr = new ArrayList<SoundSteucture>();
fileSelectedName.setText(sountlabel.getText().toString());
String [] LabelNames={"A desayunar","A la valenciana","Al currele","Apagas o apagas","Arroz 3 delicias","Clásico e infalible","Con café mejor",
"De buen humor","El coche fantástico","El gallo Claudio","Energía positiva","Final destroyer","Fresas con nata","Manos arriba","Profundidad",
"Sabanas pegadas","Sax o Phone","Tocando el cielo"};//indices
final String [] fileNames={"a_desayunar","a_la_valenciana","al_currele","apagas_o_apagas","arroz_3_delicias","clasico_e_infalible","con_cafe_mejor",
"de_buen_humor","el_coche_fantastico","el_gallo_claudio","energia_positiva","final_destroyer","fresas_con_nata","manos_arriba","profundidad",
"sabanas_pegadas","sax_o_phone","tocando_el_cielo"};//archivos
if (_adapterHistory != null) {
_adapterHistory.clear(); //clear se usa solo con los arrayadapter, si fuera simple adapter llevaria removeAllViews
_adapterHistory.notifyDataSetChanged();
}
for (int i=0;i<LabelNames.length;i++){
strAdapHistory.setNames(LabelNames[i]);
strAdapHistory.setIdentif(fileNames[i]);
if(fileSelectedName.getText().toString().equals(fileNames[i].replace("_"," ")))
strAdapHistory.setCheck("1"); //consultador
else
strAdapHistory.setCheck("0");
structureHistoryArr.add(strAdapHistory);
strAdapHistory = new SoundSteucture();
}
if (structureHistoryArr != null) {
_adapterHistory = new SoundAdapter(this, structureHistoryArr,pause, play, fileSelectedName, listsounds, PICKFILE_RESULT_CODE);
listsounds.setAdapter(_adapterHistory);
_adapterHistory.notifyDataSetChanged();
}
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectusicFromBworser = false;
try {
if (media != null) {
media.stop(); //error
media = null;
media = new MediaPlayer();
}
} catch(Exception e){
Log.d("Nitif Activity", e.toString());
}
}
});
final Button pauseFinal = pause;
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!fileSelectedName.getText().toString().equals(getString(R.string.sound))) {
pauseFinal.callOnClick();
int resID = 0;
if (!fileSelectedName.getText().toString().contains("/")) {
String tono = fileSelectedName.getText().toString().replace(" ","_");
resID = getResources().getIdentifier(tono, "raw", getPackageName());
media = MediaPlayer.create(view.getContext(), resID);
media.setVolume(1000, 1000);
media.start();
} else {
try {
if (!selectusicFromBworser) {
media.setDataSource(context, Uri.parse(fileSelectedName.getText().toString()));
}
media.prepareAsync();
media.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
Log.e("eeee???", e.toString());
}
}
}
}
});
exitW.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pauseFinal.callOnClick();
alertDialog.dismiss();
selectusicFromBworser = false;
}
});
sound_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectusicFromBworser = false;
if((!fileSelectedName.getText().toString().equals(""))&&(!fileSelectedName.getText().toString().equals("fileB")))
sountlabel.setText(fileSelectedName.getText().toString().replace("_"," "));
pauseFinal.callOnClick();
alertDialog.dismiss();
}
});
alertDialog.setView(dialogView);
alertDialog.show();
}
My code ArrayAdapter:
public class SoundAdapter extends ArrayAdapter<SoundSteucture> {
List<SoundSteucture> imageAndTexts1 =null;
Activity activity;
Button pause,play;
TextView fileSelectedName;
ListView listItems;
int PICKFILE_RESULT_CODE;
public SoundAdapter(Activity activity, List<SoundSteucture> imageAndTexts, Button pause, Button play, TextView fileSelectedName, ListView listItems, int PICKFILE_RESULT_CODE) {
super(activity, 0, imageAndTexts);
imageAndTexts1 = imageAndTexts;
this.pause = pause;
this.play = play;
this.fileSelectedName = fileSelectedName;
this.listItems = listItems;
this.PICKFILE_RESULT_CODE = PICKFILE_RESULT_CODE;
}
static class ViewHolder {
TextView labelFile;
TextView fileName;
ImageView deint;
}
public View getView(final int position, View rowView, ViewGroup parent) {
activity = (Activity) getContext();
ViewHolder holder = new ViewHolder();
if (rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.adapter_sounds, parent, false);
holder.labelFile = (TextView)rowView.findViewById(R.id.labelFile);
holder.fileName = (TextView)rowView.findViewById(R.id.fileName);
holder.deint = (ImageView) rowView.findViewById(R.id.deint);
rowView.setTag(holder);
}else {
holder = (ViewHolder) rowView.getTag();
}
final String labelf = imageAndTexts1.get(position).getNames();
final String labelN = imageAndTexts1.get(position).getIdentif();
final String check = imageAndTexts1.get(position).getCheck();
holder.labelFile.setText(labelf);
holder.fileName.setText(labelN);
if(check.equals("1")){
holder.deint.setVisibility(View.VISIBLE);
}else{
holder.deint.setVisibility(View.GONE);
}
final ViewHolder finalHolder = holder;
holder.labelFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ImageView imageList;
for(int a=0; a < listItems.getCount(); a++){
try {
imageList = (ImageView) listItems.getChildAt(a).findViewById(R.id.deint);
imageList.setVisibility(View.GONE);
}
catch(Exception e1){ //if not checkBox, null View, etc
}
}
for(int j=0; j < imageAndTexts1.size(); j++){
imageAndTexts1.get(j).setCheck("0");
}
if(check.equals("0")){
finalHolder.deint.setVisibility(View.VISIBLE);
imageAndTexts1.get(position).setCheck("1");
}else{
finalHolder.deint.setVisibility(View.GONE);
imageAndTexts1.get(position).setCheck("0");
}
fileSelectedName.setText(labelN.replace("_"," "));
if(!finalHolder.labelFile.getText().equals("fileB"))
play.callOnClick();
else
openfilesFolder();
}
});
return rowView;
}
//files browser
private void openfilesFolder(){
Intent chooseFile;
Intent intent;
chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("audio/*");
//chooseFile.setType("*/*");
intent = Intent.createChooser(chooseFile, activity.getString(R.string.choosefile));
activity.startActivityForResult(intent, PICKFILE_RESULT_CODE);
}
Activity Result in Principal Activity:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICKFILE_RESULT_CODE && resultCode == Activity.RESULT_OK) {
Uri content_describer = data.getData();
Log.e("eeee???", "ee->" + data.getData().getPath());
idenss.setText(content_describer.toString());
selectusicFromBworser = true;
try {
media.setDataSource(this, content_describer);
} catch (IOException e) {
e.printStackTrace();
}
playGlobal.callOnClick();
}
}
In my case the problem was because of beasy sdcard when device was mounted as exteranl storage to pc so checking if the file is available solved the problem. Maybe it helps someone