从外部存储装载ListView上的.mp3文件列表不能在marshmallow

时间:2017-03-20 05:24:10

标签: android android-music-player android-storage

可能这是在Lolipop / Kitkat之前有效,但我没有测试它。我正在我的xperia m2 aqua上的marshmallow上进行测试,并且它没有显示来自我的可移动SD卡的音乐,因此,我将两个音乐从sdCard复制到内部存储,它正在显示这两个音乐。其他音乐播放器在手机上运行良好。 以下是我的代码:

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;
}
}

来自上方代码结果的Log.d

mounted
/storage/emulated/0
/storage/emulated/0

明确许可

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

和Permisson以编程方式为Marshmallow及更高

 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);

        }
    }

结果 它只显示内部存储的歌曲。我已经将两首歌曲添加到内部存储器中进行检查,并且它显示出来了。 为什么不从sdCard读取,虽然我已经设置了权限和所有正常工作的代码?

更新

@Manoj已将此问题标记为可能重复,但事实并非如此。我已经给予了适当的许可,如果用户也点击拒绝,那么下次会再次询问。在我的代码中,我使用if / else进行许可,我认为@Manoj没有清楚地看到它......

1 个答案:

答案 0 :(得分:0)

您帖子的主题完全错误,因为您唯一想知道的是Dim str() As String str = Split(barcodeText, "|") MsgBox("Your barcode is : " & str(1))

这个网站每周至少要问两次,所以只要稍微阅读一下就可以找到它。

但请查看How to detetermine the path to an SD card返回的第二项。