获得专辑技术随着专辑名称的Andr​​oid [英] Get Album Art With Album Name Android

查看:224
本文介绍了获得专辑技术随着专辑名称的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示专辑封面,在列表视图专辑名称。但我没有得到,以显示专辑封面的方式。我曾尝试从Android的 封面。

下面是我的code:

 光标光标= managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,NULL,NULL,NULL,NULL);
          如果(光标== NULL)
          {
              //查询失败,处理错误。
          }
          否则如果(!cursor.moveToFirst())
          {
             //在设备上无介质。
          }
          其他
          {
              INT titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART);
              INT ID = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ID); //这里值i m到处-1。

              的for(int i = 0; I< cursor.getCount();我++)
              {
                  如果(ID℃,)
                  {
                        龙专辑=的Long.parseLong(cursor.getString(ID));
                        字符串coverPath = cursor.getString(titleColumn);

                        上下文的背景下= NULL;
                        ContentResolver的解析度= context.getContentResolver();
                        开放的我们的uri = ContentUris.withAppendedId(sArtworkUri,专辑);
                        如果(URI!= NULL)
                        {
                            在的InputStream = NULL;
                            尝试
                            {
                                在= res.openInputStream(URI);
                                位图B = BitmapFactory.de codeStream(在,空,sBitmapOptions);
                                ImageView的coverAlbum =(ImageView的)findViewById(R.id.thumbnail);
                                coverAlbum.setImageBitmap(B);

                            }赶上(FileNotFoundException异常前)
                            {

                            }

                        }

                  }
                         // code在列表视图中插入
                  cursor.moveToNext();
               }
           }
           cursor.close();
}
 

但我正在逐渐的album_id -1。所以,我没有得到album_id专辑,但我有我的SD卡专辑中的歌曲。而SD卡是有文件夹,例如 albumthums ,其中包括一些文件。所以,请给我解决方案,使专辑的名字和艺术。 感谢名单提前。


这是我的错误日志:

  12-03 15:19:22.051:WARN / System.err的(32334):显示java.lang.NullPointerException
12-03 15:19:22.060:WARN / System.err的(32334):在com.mnp.AlbumList.onCreate(AlbumList.java:59)
12-03 15:19:22.120:WARN / System.err的(32334):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-03 15:19:22.130:WARN / System.err的(32334):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
12-03 15:19:22.140:WARN / System.err的(32334):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
12-03 15:19:22.161:WARN / System.err的(32334):在android.app.ActivityThread.access $ 2200(ActivityThread.java:119)
12-03 15:19:22.171:WARN / System.err的(32334):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)
12-03 15:19:22.180:WARN / System.err的(32334):在android.os.Handler.dispatchMessage(Handler.java:99)
12-03 15:19:22.201:WARN / System.err的(32334):在android.os.Looper.loop(Looper.java:123)
12-03 15:19:22.210:WARN / System.err的(32334):在android.app.ActivityThread.main(ActivityThread.java:4363)
12-03 15:19:22.220:WARN / System.err的(32334):在java.lang.reflect.Method.invokeNative(本机方法)
12-03 15:19:22.240:WARN / System.err的(32334):在java.lang.reflect.Method.invoke(Method.java:521)
12-03 15:19:22.250:WARN / System.err的(32334):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
12-03 15:19:22.260:WARN / System.err的(32334):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-03 15:19:22.270:WARN / System.err的(32334):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

使用下面code拿到专辑封面与歌曲信息。你可以稍微改变,仅显示专辑名称,而不是歌曲列表。

 公共类BrowseAudioActivity扩展活动器具
            AppConstants {
        私人上下文的背景下;
        私人的ArrayList< AudioListModel> audioArrayList =新的ArrayList< AudioListModel>();
        私人AudioListAdapter audioListAdapter;
        私人的ListView audioListView;



/ **第一次创建活动时调用。 * /
        @覆盖
        公共无效的onCreate(包savedInstanceState){
            super.onCreate(savedInstanceState);
            getWindow()setBackgroundDrawable(新ColorDrawable(Color.TRANSPARENT))。
            的setContentView(R.layout.audio_list);
            UtilityClass.addActivityToStack(本);
            上下文=这一点;
            audioListView =(ListView控件)findViewById(R.id.list_audio);

            新GetAudioListAsynkTask(上下文).execute((无效)NULL);



        }

        私人无效InitLayout在(){
            最后开放的URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            最终的String [] cursor_cols = {MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,
                    MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.ALBUM_ID,
                    MediaStore.Audio.Media.DURATION};
            最终的字符串,其中= MediaStore.Audio.Media.IS_MUSIC += 1;
            最后光标光标= context.getContentResolver()查询(URI,
                    cursor_cols,其中,NULL,NULL);

            而(cursor.moveToNext()){
                字符串艺术家= cursor.getString(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                字符串专辑= cursor.getString(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                字符串跟踪= cursor.getString(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                字符串数据= cursor.getString(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                龙ALBUMID = cursor.getLong(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

                INT持续时间= cursor.getInt(光标
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

                乌里sArtworkUri =开放的我们
                        .parse(内容://媒体/外部/音频/ albumart);
                乌里albumArtUri = ContentUris.withAppendedId(sArtworkUri,ALBUMID);

                Logger.debug(albumArtUri.toString());
                点阵位图= NULL;
                尝试 {
                    位= MediaStore.Images.Media.getBitmap(
                            context.getContentResolver(),albumArtUri);
                    位图= Bitmap.createScaledBitmap(位图,30,30,真);

                }赶上(FileNotFoundException异常除外){
                    exception.printStackTrace();
                    位= BitmapFactory.de codeResource(context.getResources()
                            R.drawable.audio_file);
                }赶上(IOException异常E){

                    e.printStackTrace();
                }

                AudioListModel audioListModel =新AudioListModel();
                audioListModel.setArtist(艺术家);
                audioListModel.setBitmap(位);
                audioListModel.setAlbum(专辑);
                audioListModel.setTrack(轨道);
                audioListModel.setData(数据);
                audioListModel.setAlbumId(ALBUMID);
                audioListModel.setDuration(持续时间);
                audioListModel.setAlbumArtUri(albumArtUri);

                audioArrayList.add(audioListModel);

            }

        }

        公共字符串getRealPathFromURI(URI contentUri){
            的String []凸出= {MediaStore.Images.Media.DATA};
            光标光标= context.getContentResolver()查询(contentUri,PROJ,
                    NULL,NULL,NULL);
            INT与Column_Index =光标
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            cursor.moveToFirst();
            返回cursor.getString(Column_Index中);
        }

        私有类GetAudioListAsynkTask扩展的AsyncTask<虚空,虚空,布尔> {

            私人上下文的背景下;
            私人CustomProgressDialog progressDialog;

            公共GetAudioListAsynkTask(上下文的背景下){

                this.context =背景;
            }

            @覆盖
            在preExecute保护无效(){
                progressDialog =新CustomProgressDialog(背景下,
                        AUDIO_LOADING_HEADING,AUDIO_LOADING_MSG);
                progressDialog.setCancelable(假);
                progressDialog.show();
                super.on preExecute();

            }

            @覆盖
            保护布尔doInBackground(空... PARAMS){
                尝试 {
                    InitLayout在();

                    返回true;
                }赶上(例外五){
                    返回false;

                }

            }

            @覆盖
            保护无效onPostExecute(布尔结果){
                progressDialog.dismiss();

                audioListAdapter =新AudioListAdapter(背景下,audioArrayList);
                audioListView.setAdapter(audioListAdapter);
                audioListView
                        .setOnItemClickListener(新AudioListItemClickListener(
                                方面,audioArrayList));

            }
        }

        @覆盖
        保护无效的onPause(){
            super.onPause();
            overridePendingTransition(0,0);
        }

        @覆盖
        保护无效的onDestroy(){
            super.onDestroy();
            UtilityClass.removeActivityOnFinish(本);
        }

        @覆盖
        公共无效onBack pressed(){
            super.onBack pressed();
            完();
        }

    }
 

I want to display album art with album name in listview. But i am not getting the way to display album art. I have tried from cover art on android.

Here is my Code :

Cursor cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null, null);
          if (cursor == null) 
          {
              //Query Failed , Handle error.
          }
          else if (!cursor.moveToFirst()) 
          {
             //No media on the device.
          }
          else
          {
              int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART);
              int id = cursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ID); //here value i m getting -1 .

              for(int i=0;i<cursor.getCount();i++)
              {
                  if(id<0)
                  {
                        Long album =Long.parseLong(cursor.getString(id)); 
                        String coverPath = cursor.getString(titleColumn);

                        Context context = null;
                        ContentResolver res = context.getContentResolver();
                        Uri uri = ContentUris.withAppendedId(sArtworkUri, album);
                        if (uri != null)
                        {
                            InputStream in = null;
                            try
                            {
                                in = res.openInputStream(uri);
                                Bitmap b = BitmapFactory.decodeStream(in, null, sBitmapOptions);
                                ImageView coverAlbum=(ImageView)findViewById(R.id.thumbnail);
                                coverAlbum.setImageBitmap(b);

                            } catch (FileNotFoundException ex)
                            {

                            }

                        }

                  }
                         //code to insert in listview
                  cursor.moveToNext();
               }
           }
           cursor.close();
}

But i am getting the album_id -1. So i am not getting album_id for album but i am having album song in my sdcard. And sdcard is having folder like albumthums which includes some files. So please give me solution to get album name and art. Thanx in Advance.


This is my error log :

12-03 15:19:22.051: WARN/System.err(32334): java.lang.NullPointerException
12-03 15:19:22.060: WARN/System.err(32334):     at com.mnp.AlbumList.onCreate(AlbumList.java:59)
12-03 15:19:22.120: WARN/System.err(32334):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-03 15:19:22.130: WARN/System.err(32334):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
12-03 15:19:22.140: WARN/System.err(32334):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
12-03 15:19:22.161: WARN/System.err(32334):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
12-03 15:19:22.171: WARN/System.err(32334):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
12-03 15:19:22.180: WARN/System.err(32334):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 15:19:22.201: WARN/System.err(32334):     at android.os.Looper.loop(Looper.java:123)
12-03 15:19:22.210: WARN/System.err(32334):     at android.app.ActivityThread.main(ActivityThread.java:4363)
12-03 15:19:22.220: WARN/System.err(32334):     at java.lang.reflect.Method.invokeNative(Native Method)
12-03 15:19:22.240: WARN/System.err(32334):     at java.lang.reflect.Method.invoke(Method.java:521)
12-03 15:19:22.250: WARN/System.err(32334):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
12-03 15:19:22.260: WARN/System.err(32334):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-03 15:19:22.270: WARN/System.err(32334):     at dalvik.system.NativeStart.main(Native Method)

解决方案

use Below Code to get album art with song information. you can change slightly to display only album names instead of songs list.

 public class BrowseAudioActivity extends Activity implements
            AppConstants {
        private Context context;
        private ArrayList<AudioListModel> audioArrayList = new ArrayList<AudioListModel>();
        private AudioListAdapter audioListAdapter;
        private ListView audioListView;



/** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            setContentView(R.layout.audio_list);
            UtilityClass.addActivityToStack(this);
            context = this;
            audioListView = (ListView) findViewById(R.id.list_audio);

            new GetAudioListAsynkTask(context).execute((Void) null);



        }

        private void initLayout() {
            final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            final String[] cursor_cols = { MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
                    MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.ALBUM_ID,
                    MediaStore.Audio.Media.DURATION };
            final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
            final Cursor cursor = context.getContentResolver().query(uri,
                    cursor_cols, where, null, null);

            while (cursor.moveToNext()) {
                String artist = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                String album = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                String track = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                String data = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                Long albumId = cursor.getLong(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

                int duration = cursor.getInt(cursor
                        .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

                Uri sArtworkUri = Uri
                        .parse("content://media/external/audio/albumart");
                Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);

                Logger.debug(albumArtUri.toString());
                Bitmap bitmap = null;
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(
                            context.getContentResolver(), albumArtUri);
                    bitmap = Bitmap.createScaledBitmap(bitmap, 30, 30, true);

                } catch (FileNotFoundException exception) {
                    exception.printStackTrace();
                    bitmap = BitmapFactory.decodeResource(context.getResources(),
                            R.drawable.audio_file);
                } catch (IOException e) {

                    e.printStackTrace();
                }

                AudioListModel audioListModel = new AudioListModel();
                audioListModel.setArtist(artist);
                audioListModel.setBitmap(bitmap);
                audioListModel.setAlbum(album);
                audioListModel.setTrack(track);
                audioListModel.setData(data);
                audioListModel.setAlbumId(albumId);
                audioListModel.setDuration(duration);
                audioListModel.setAlbumArtUri(albumArtUri);

                audioArrayList.add(audioListModel);

            }

        }

        public String getRealPathFromURI(Uri contentUri) {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = context.getContentResolver().query(contentUri, proj,
                    null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }

        private class GetAudioListAsynkTask extends AsyncTask<Void, Void, Boolean> {

            private Context context;
            private CustomProgressDialog progressDialog;

            public GetAudioListAsynkTask(Context context) {

                this.context = context;
            }

            @Override
            protected void onPreExecute() {
                progressDialog = new CustomProgressDialog(context,
                        AUDIO_LOADING_HEADING, AUDIO_LOADING_MSG);
                progressDialog.setCancelable(false);
                progressDialog.show();
                super.onPreExecute();

            }

            @Override
            protected Boolean doInBackground(Void... params) {
                try {
                    initLayout();

                    return true;
                } catch (Exception e) {
                    return false;

                }

            }

            @Override
            protected void onPostExecute(Boolean result) {
                progressDialog.dismiss();

                audioListAdapter = new AudioListAdapter(context, audioArrayList);
                audioListView.setAdapter(audioListAdapter);
                audioListView
                        .setOnItemClickListener(new AudioListItemClickListener(
                                context, audioArrayList));

            }
        }

        @Override
        protected void onPause() {
            super.onPause();
            overridePendingTransition(0, 0);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            UtilityClass.removeActivityOnFinish(this);
        }

        @Override
        public void onBackPressed() {
            super.onBackPressed();
            finish();
        }

    }

这篇关于获得专辑技术随着专辑名称的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆