android外部存储规范,android – 音乐播放器要求写外部存储权限?

我正在

Android中创建一个音乐播放器应用程序.它工作正常但每当我滚动歌曲列表时它开始崩溃并给出这个例外

Process: com.example.lenovo.musicplayer, PID: 31100

java.lang.SecurityException: External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1460104607336: Neither user 10294 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.

at android.os.Parcel.readException(Parcel.java:1555)

at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)

at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:153)

at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:691)

at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1170)

at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:994)

at android.content.ContentResolver.openInputStream(ContentResolver.java:719)

at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:1110)

at com.example.lenovo.musicplayer.Adapter.getView(Adapter.java:119)

at android.widget.AbsListView.obtainView(AbsListView.java:2571)

at android.widget.ListView.makeAndAddView(ListView.java:1894)

at android.widget.ListView.fillDown(ListView.java:710)

at android.widget.ListView.fillGap(ListView.java:674)

at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5900)

at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:5378)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:825)

at android.view.Choreographer.doCallbacks(Choreographer.java:619)

at android.view.Choreographer.doFrame(Choreographer.java:578)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:811)

at android.os.Handler.handleCallback(Handler.java:815)

at android.os.Handler.dispatchMessage(Handler.java:104)

at android.os.Looper.loop(Looper.java:214)

at android.app.ActivityThread.main(ActivityThread.java:6102)

at java.lang.reflect.Method.invoke(Native Method)

at java.lang.reflect.Method.invoke(Method.java:372)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

当我在清单文件中提供写入权限时,这个问题就消失了,但是当我不向任何类型的存储写入任何内容时,我不明白为什么它要求WriteExternalStoragePermission.

据我所知,音乐播放器不需要写入外部存储权限.

这是歌曲列表活动的代码

public class ActivitySongsList extends AppCompatActivity {

public static ArrayListsongsList;

ListView listView;

Toolbar toolbar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_songs_list);

toolbar= (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

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

songsList=getAudioList();

Adapter adapter=new Adapter(this,songsList);

listView.setAdapter(adapter);

getSupportActionBar().setTitle("Songs");

toolbar.setTitleTextColor(Color.parseColor("#ffffff"));

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

Intent intent=new Intent(ActivitySongsList.this,ActivityMusicDetails.class);

intent.putExtra("song",songsList.get(position));

intent.putExtra("position",String.valueOf(position));

startActivity(intent);

}

});

}

private ArrayList getAudioList() {

ArrayList musicBeanArrayList=new ArrayList<>();

try {

final Cursor mCursor = getContentResolver().query(

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,

new String[]{MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.TITLE}, null, null,

"LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC");

int count = mCursor.getCount();

int i = 0;

if (mCursor.moveToFirst()) {

do {

String song=mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));

String path=mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

long album_id=mCursor.getLong(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

String artist=mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

Uri sArtworkUri = Uri

.parse("content://media/external/audio/albumart");

Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, album_id);

musicBeanArrayList.add(new MusicBean(song,path,albumArtUri.toString(),String.valueOf(album_id),artist));

/*songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));

mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));*/

i++;

} while (mCursor.moveToNext());

}

mCursor.close();

}catch (Exception e)

{

e.printStackTrace();

}

return musicBeanArrayList;

}

}

它崩溃了这条线上的例外

bitmap = MediaStore.Images.Media.getBitmap(ctx.getContentResolver(),uri);

在这段代码中我得到了相应的mp3文件的专辑.

但是这段代码也只是从外部存储器读取,因此这也不应该要求写入权限,因为我只是在读取位图而不是写入它.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值