【问题标题】:not getting album art没有得到专辑封面
【发布时间】:2018-01-11 16:24:34
【问题描述】:

在我的音乐应用程序中,我试图获取专辑封面,但无法获取。我不知道这有什么问题。我尝试了一些代码,告诉我出了什么问题。

这是日志。 java.lang.IllegalStateException:无法读取第 0 行, 来自 CursorWindow 的 col -1。确保光标已初始化 在从中访问数据之前正确。 在 android.database.CursorWindow.nativeGetString(Native Method) 在 android.database.CursorWindow.getString(CursorWindow.java:438) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 在 android.database.CursorWrapper.getString(CursorWrapper.java:137) 在 layout.BlankFragment2.loadSongs(BlankFragment2.java:228) 在 layout.BlankFragment2.checkUserPermission(BlankFragment2.java:186) 在 layout.BlankFragment2.onCreateView(BlankFragment2.java:143)

public class BlankFragment2 extends Fragment {
    private ArrayList<songInfo> _songs = new ArrayList<songInfo>();
    RecyclerView recyclerView;
    SeekBar seekBar;
    public songAdapter songAdapter1;
    ImageView album_art;
    MediaPlayer mediaPlayer;
    private Handler myHandler = new Handler();
    //byte[] art;
    String id;
    View rootView;

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private BlankFragment.OnFragmentInteractionListener mListener;

    public BlankFragment2() {
        // Required empty public constructor
    }

    // TODO: Rename and change types and number of parameters
    public static BlankFragment newInstance(String param1, String param2) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView= inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
        recyclerView = (RecyclerView)rootView. findViewById(R.id.recyclerView);
        seekBar = (SeekBar) rootView.findViewById(R.id.seekBar);
        album_art=(ImageView)rootView.findViewById(R.id.albumArt);
        songAdapter1 = new songAdapter(getActivity(),_songs);
        recyclerView.setAdapter(songAdapter1);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                linearLayoutManager.getOrientation());
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.addItemDecoration(dividerItemDecoration);
        songAdapter1.setOnItemClickListener(new songAdapter.OnItemClickListener() {
            public void onItemClick(RecyclerView.ViewHolder holder, View view, final songInfo obj, int position) {

                if(mediaPlayer.isPlaying()){
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;

                }else {

                    Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                            try {
                                mediaPlayer = new MediaPlayer();
                                mediaPlayer.setDataSource(obj.getSongUrl());
                                mediaPlayer.prepareAsync();
                                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                    @Override
                                    public void onPrepared(MediaPlayer mp) {
                                        mp.start();
                                        seekBar.setProgress(0);
                                        seekBar.setMax(mediaPlayer.getDuration());
                                        Log.d("Prog", "run: " + mediaPlayer.getDuration());
                                    }
                                });

                            }catch (Exception e){}
                        }

                    };
                    myHandler.postDelayed(runnable,100);

                }
            }
        });
        checkUserPermission();

        Thread t = new runThread();
        t.start();
        return rootView;
    }

    public class runThread extends Thread {


        @Override
        public void run() {
            while (true) {

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d("Runwa", "run: " + 1);
                if (mediaPlayer != null) {
                    seekBar.post(new Runnable() {
                        @Override
                        public void run() {
                            seekBar.setProgress(mediaPlayer.getCurrentPosition());
                        }
                    });

                    Log.d("Runwa", "run: " + mediaPlayer.getCurrentPosition());
                }
            }
        }

    }

    private void checkUserPermission(){
        if(Build.VERSION.SDK_INT>=23){
            if(ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED){
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},123);
                return;
            }
        }
        loadSongs();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 123:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    loadSongs();
                }else{
                    Toast.makeText(getContext(), "Permission Denied", Toast.LENGTH_SHORT).show();
                    checkUserPermission();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        }

    }

    private void loadSongs() {

        MediaMetadataRetriever metaRetriver = new MediaMetadataRetriever();
        Cursor mcursor = getContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
                MediaStore.Audio.Albums._ID + "=?",
                new String[]{String.valueOf(id)},
                null);
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
        Cursor cursor = getContext().getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {

                    String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                    String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                    String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                    String coverPath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
                    Drawable img = Drawable.createFromPath(coverPath);
                    ImageView coverAlbum=(ImageView)rootView.findViewById(R.id.albumArt);
                    coverAlbum.setImageDrawable(img);
                    songInfo s = new songInfo(name, artist, url);
                    _songs.add(s);
                }
                while (cursor.moveToNext());
                cursor.close();
                recyclerView.getAdapter().notifyDataSetChanged();
            }
        }
    }


    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (BlankFragment.OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }

    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }
}

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    问题是您的投影与您尝试获取的列不匹配。在您的投影中,您的投影中没有下面的列来解决这个问题。

    MediaStore.Audio.Media.DISPLAY_NAME
    MediaStore.Audio.Media.ARTIST
    MediaStore.Audio.Media.DATA
    

    当使用 ContentProvider 的query() 时,光标将只有投影参数中提到的列。

    【讨论】:

    • 请您详细说明一下。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2016-02-02
    • 2011-03-07
    相关资源
    最近更新 更多