【问题标题】:How to provide an option, for the user, to select music with in android application?如何为用户提供在 android 应用程序中选择音乐的选项?
【发布时间】:2012-08-15 06:10:08
【问题描述】:

我是 Android 新手,我需要一条途径来满足我的要求。在我的应用程序中,我需要为用户提供一个选项来从应用程序中选择他们的播放列表。这可能吗?请确认。

我使用以下示例代码进行了尝试,在以下代码中,我尝试从 sd 卡获取文件并在列表视图中显示它们。当我尝试运行应用程序时,我强制关闭。如果我做错了什么,请您调查一下并建议我。

我的测试课。

public class TestMediaActivity extends Activity {
/** Called when the activity is first created. */

private static final String MEDIA_PATH = new String("/sdcard/");
private List<String> songs = new ArrayList<String>();
private MediaPlayer mp = new MediaPlayer();
private int currentPosition = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    updateSongList();
}
public void updateSongList() 
{
    System.out.println("In the updateSongList");
    File home = new File(MEDIA_PATH);
    if (home.listFiles(new Mp3Filter()).length > 0) 
    {
        System.out.println("\n In the condition length>0");
            for (File file : home.listFiles(new Mp3Filter())) {
                    songs.add(file.getName());
            }

            setListAdapter( new ArrayAdapter<String>(this,R.layout.test_item, songs));
    }

}

private void setListAdapter(ArrayAdapter<String> arrayAdapter) {
    // TODO Auto-generated method stub
    System.out.println("In the setListAdapter");
}
protected void onListItemClick(ListView l, View v, int position, long id)
{
    currentPosition = position;
    playSong(MEDIA_PATH + songs.get(position));
}
private void playSong(String songPath) {
    try {

            mp.reset();
            mp.setDataSource(songPath);
            mp.prepare();
            mp.start();

            // Setup listener so next song starts automatically
            mp.setOnCompletionListener(new OnCompletionListener() {

                    public void onCompletion(MediaPlayer arg0) {
                            nextSong();
                    }

            });

    } catch (IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
    }
}
private void nextSong() {
    if (++currentPosition >= songs.size()) {
        // Last song, just reset currentPosition
        currentPosition = 0;
} else {
        // Play next song
        playSong(MEDIA_PATH + songs.get(currentPosition));
}
}


}

支持类是,

public class Mp3Filter implements FilenameFilter 
{

@Override
public boolean accept(File dir, String filename) {
    // TODO Auto-generated method stub
    System.out.println("In the Mp3Filter");
    return (filename.endsWith(".mp3"));
   }

}

而日志猫中的错误是....

 08-15 14:49:35.800: E/AndroidRuntime(31871): FATAL EXCEPTION: main
 08-15 14:49:35.800: E/AndroidRuntime(31871): java.lang.RuntimeException: Unable to       start activity     ComponentInfo{com.vsoft.TestMedia/com.vsoft.TestMedia.TestMediaActivity}:  java.lang.NullPointerException
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2797)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread.access$2300(ActivityThread.java:135)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2132)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.os.Looper.loop(Looper.java:143)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread.main(ActivityThread.java:4914)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at java.lang.reflect.Method.invokeNative(Native Method)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at java.lang.reflect.Method.invoke(Method.java:521)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at dalvik.system.NativeStart.main(Native Method)
08-15 14:49:35.800: E/AndroidRuntime(31871): Caused by: java.lang.NullPointerException
08-15 14:49:35.800: E/AndroidRuntime(31871):    at  com.vsoft.TestMedia.TestMediaActivity.updateSongList(TestMediaActivity.java:36)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at com.vsoft.TestMedia.TestMediaActivity.onCreate(TestMediaActivity.java:29)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1065)
08-15 14:49:35.800: E/AndroidRuntime(31871):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)
08-15 14:49:35.800: E/AndroidRuntime(31871):    ... 11 more

【问题讨论】:

标签: android android-music-player


【解决方案1】:

这绝对是可能的。您可能希望使用ListView 来使用可检查的列表项显示歌曲。然后将ListView 与您编写的SimpleAdapter 挂钩。 Adapter 需要从 SD 卡(或保存它们的任何位置)中获取歌曲标题,然后为 ListView 提供适当的列表项。

编辑

File home = new File(MEDIA_PATH);

是问题所在。 homenull。它是null 的原因是因为找不到该文件。您不应该使用/sdcard/ 访问 SD 卡,因为 SD 卡目录是设备相关的。你想要的是:

File sdCard = Environment.getExternalStorageDirectory();

【讨论】:

  • @ Mike,感谢您的快速解决方案,我做了一个示例应用程序并尝试过,但出错了。你能检查一下吗? (我用代码编辑了我的问题,请看一下。谢谢。
  • 我刚刚发布了错误日志,如果我做错了什么,请您检查并建议我
  • 你的问题是一个空指针,除了 TestMediaActivity.java 第 36 行。你能指出那是哪里吗?
  • @Mike, if (home.listFiles(new Mp3Filter()).length > 0) 这是第 36 行的代码。
  • 知道了,我会尝试并让您认识迈克。感谢大家的支持
【解决方案2】:

我从未尝试过使用音频,但您不能只使用过滤器“audio/*”创建一个意图并调用活动以获取结果吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2012-07-24
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多