【问题标题】:How to play music by its uri如何通过 uri 播放音乐
【发布时间】:2016-08-02 04:29:16
【问题描述】:

我正在尝试检索音乐数据,将数据保存到数组列表中,并将数据字符串转换为 uri 并使用它来播放音乐,但是当我单击时应用程序崩溃。列表视图项目,它将按其 uri 播放音乐 这是我的代码`

public class Mediafileinfo {
private String title;
private String artist;
private String data;
public String getData() {
    return data;
}

public void setData(String data) {
    this.data = data;
}
}

` 这是我保存媒体数据的课程 我正在尝试这样玩 我在哪里做错了

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Mediafileinfo item = new Mediafileinfo();
            Uri myUri = Uri.parse(item.getData());
            mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(String.valueOf(myUri));
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
        }
    });

我的主要活动课程是获取数据

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    External();
    ListView listView = (ListView) findViewById(R.id.listView);
    ArrayAdapter arrayAdapter = new CustomeAdapter(this, audioList);
    listView.setAdapter(arrayAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Mediafileinfo item = new Mediafileinfo();
            Uri myUri = Uri.parse(item.getData());

            mediaPlayer = new MediaPlayer();

            mediaPlayer.reset();
            try {
                mediaPlayer.setDataSource(MainActivity.this,myUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();

        }
    });
}

private void External() {
    try {
        String[] proj = {MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.DURATION,
        MediaStore.Audio.Media.DATA};// Can include more data for more details and check it.

        String selection = MediaStore.Audio.Media.DURATION + ">=90000";

        String[] selectionArgs = null;

        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

        Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, proj, selection, selectionArgs, sortOrder);

        if (audioCursor != null) {
            if (audioCursor.moveToFirst()) {
                do {
                    int audioTitle = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
                    int audioartist = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
                    int audioalbum = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION);
                    int audiodata= audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
                    Mediafileinfo info = new Mediafileinfo();
                    info.setData(audioCursor.getString(audiodata));
                    info.setTitle(audioCursor.getString(audioTitle));
                    info.setAlbum(audioCursor.getLong(audioalbum));
                    info.setArtist(audioCursor.getString(audioartist));
                    audioList.add(info);
                } while (audioCursor.moveToNext());
            }
        }
        audioCursor.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

我的客户适配器

public class CustomeAdapter extends ArrayAdapter {
public CustomeAdapter(Context context, ArrayList<Mediafileinfo> audioList) {
    super(context,R.layout.custome,audioList);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflate=LayoutInflater.from(getContext());
    View v=inflate.inflate(R.layout.custome,parent,false);
    Mediafileinfo item = (Mediafileinfo) getItem(position);
    TextView text1 = (TextView) v.findViewById(R.id.textView);
    text1.setText(item.getData());
    TextView text2 = (TextView) v.findViewById(R.id.textView2);
    text2.setText(item.getArtist());
    TextView text3=(TextView)v.findViewById(R.id.textView3);
    text3.setText(String.format("%02d:%02d",
            TimeUnit.MILLISECONDS.toMinutes(item.getAlbum()),
            TimeUnit.MILLISECONDS.toSeconds(item.getAlbum()) -
                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(item.getAlbum()))));

    return v;
}
}

通过这种方式,我可以获取数据以及单击项目时如何播放数据

【问题讨论】:

  • 错误日志是什么?
  • java空点异常uri字符串
  • 检查this
  • 但是如果我从内部存储中获取 uri 怎么办
  • @SAVVY 你能告诉我们item.getData()的值吗?

标签: android mp3 android-mediaplayer


【解决方案1】:

使用此mediaPlayer.setDataSource(MainActivity.this,myUri); 而不是mediaPlayer.setDataSource(String.valueOf(myUri));

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            //Mediafileinfo item = new Mediafileinfo();
            Mediafileinfo item = audioList.get(i);
            Uri myUri = Uri.parse(item.getData());
            mediaPlayer = new MediaPlayer();
            try {
               // mediaPlayer.setDataSource(String.valueOf(myUri));
               mediaPlayer.setDataSource(MainActivity.this,myUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
        }
    });

【讨论】:

  • 仍然出现 java.lang.NullPointerException: uriString 之类的错误,并显示单击项目时出现一些错误
  • 可以在这里发布 logcat 吗? Mediafileinfo 是什么?
  • 您正在创建Mediafileinfo 对象,然后从中获取getData()。我认为您的项目为空,因为您现在正在创建它?
  • 我可以在我的列表视图中显示数据
  • 我正在输入我的漏洞代码希望能帮助你找到我的错误
【解决方案2】:

试试这个

try {
   Uri myUri = Uri.parse(item.getData());
   Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), myUri);
   r.play();
} catch (Exception e) {
  e.printStackTrace();
}

【讨论】:

    【解决方案3】:

    最近,我用以下逻辑解决了这个问题:

    使用这个:

    SetDataSourc(context, uri)
    

    而不是这个:

    setDataSource(uri)
    

    对于这个解决方案,您不需要阅读上面的权限 = Q

    【讨论】:

      【解决方案4】:

      你应该启动一次 MediaPlayer

      并在 mediaPlayer.setDataSource(String.valueOf(myUri)) 之前添加 mediaPlayer.reset

      试试这个可能会解决你的问题

      【讨论】:

      • 请避免添加您没有测试过的答案。这很明显,因为 OP 说它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2014-06-20
      • 1970-01-01
      • 2012-11-21
      相关资源
      最近更新 更多