Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从外部存储加载ListView上的.mp3文件列表,该列表在棉花糖上不起作用_Android_Android Music Player_Android Storage - Fatal编程技术网

Android 从外部存储加载ListView上的.mp3文件列表,该列表在棉花糖上不起作用

Android 从外部存储加载ListView上的.mp3文件列表,该列表在棉花糖上不起作用,android,android-music-player,android-storage,Android,Android Music Player,Android Storage,也许这在Lolipop/Kitkat之前就可以使用,但我没有测试它。我在我的xperia m2 aqua上的棉花糖上测试这个,它没有显示我的可移动SD卡中的音乐,所以,我将SD卡中的两个音乐复制到内部存储,它显示这两个音乐。其他音乐播放器在手机上运行良好。 下面是我的代码: public class ListviewActivity extends AppCompatActivity { ListView listView; String[] items; ArrayAdapter<Str

也许这在Lolipop/Kitkat之前就可以使用,但我没有测试它。我在我的xperia m2 aqua上的棉花糖上测试这个,它没有显示我的可移动SD卡中的音乐,所以,我将SD卡中的两个音乐复制到内部存储,它显示这两个音乐。其他音乐播放器在手机上运行良好。 下面是我的代码:

public class ListviewActivity extends AppCompatActivity {
ListView listView;
String[] items;
ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_songs);

    listView= (ListView) findViewById(R.id.listView);


     ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory());
    Log.d("myLog"," "+Environment.getExternalStorageState());
    Log.d("myLog"," "+Environment.getExternalStorageDirectory());
    Log.d("myLog"," "+Environment.getExternalStorageDirectory().getAbsolutePath());



    items = new String[mySongs.size()];

    for (int i = 0; i < mySongs.size(); i++) {
        Toast.makeText(this, "  "+mySongs.get(i).getName().toString(), Toast.LENGTH_SHORT).show();
        //  items[i] = mySongs.get(i).getName().toString();
        items[i] = mySongs.get(i).getName().toString();
    }
    arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
    Log.d("myLog"," "+items);



    listView.setAdapter(arrayAdapter);
}
public ArrayList<File> findSong(File root) {

    ArrayList<File> al = new ArrayList<File>();
    File[] files = root.listFiles();    // All file and folder automatic collect

    for (File singleFile : files) {
        if (singleFile.isDirectory() && !singleFile.isHidden()) {
            al.addAll(findSong(singleFile)); //Recursively call
        } else {
            if (singleFile.getName().endsWith(".mp3")) {
                al.add(singleFile);
            }
        }
    }
    return al;
}
}
舱单许可证

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
结果 它只显示来自内部存储器的歌曲。我在内存中添加了两首歌曲供检查,结果显示出来尽管我已经设置了权限和所有工作代码,为什么不从SD卡读取??

更新


@Manoj将这个问题标记为可能的重复,但这不是真的。我已经给了一个适当的权限,如果用户也点击拒绝,那么下次它会再次询问。在我的代码中,我使用if/else作为权限,我认为@Manoj没有清楚地看到它

你文章的主题完全错了,因为你唯一想知道的是
如何确定SD卡的路径

这个问题每周在这个网站上至少被问两次,所以只要稍加阅读,你就会发现它


但是看看由@ManojFrekzz()返回的第二个项目,
getExternalFilesDirs()

可能重复的@ManojFrekzz嘿,你可以看到上面的代码,我已经通过编程发布了棉花糖和更高版本的权限,我已经在那里使用了if,else来检查这一点。如果用户也拒绝,它将在下次询问。当然,它不会显示来自SD卡的文件,因为您没有代码。您只需查看getExternalStorageDirectory(),它不是SD卡,而是您称之为内部内存的外部内存。但是看看函数名。@greenapps你确定吗?你能回答我怎样才能从SD卡上获得歌曲吗?你也可以自己回答。您只需要知道sd卡的完整路径。你不需要其他代码。我不明白你的意思。getExternalFiesDirs();从sdCard/Android/data/my package name/right重新运行数据?正如这里提到的,但我需要/sdCard/(根目录和子文件夹)中的all.mp3,它返回两个路径。两个文件对象。你说的是哪条路?你的链接是关于getExternalFilesDir()的,它是一个不同的函数,只返回一项。我不能使用它,因为它只在api 19中添加,而我的minSdk是14。我能做什么?试试System.getenv(辅助存储);。请准备好它可以返回null。如果这不起作用,那么添加一个目录选择器,让用户选择SD卡。不,不,我不能这样做。我太累了。从昨天早上开始,我一直在试图解决这个问题,但无法:(N我失去了希望。为什么访问外部存储如此困难?我接近getExternalFilesDirs(),我将null作为字符串参数传递,程序崩溃。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

        }else{
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 738);

        }
    }