Java 使用解码字节时outofmemoryexception

Java 使用解码字节时outofmemoryexception,java,android,bitmap,out-of-memory,Java,Android,Bitmap,Out Of Memory,我正在创建媒体播放器,并使用MediaMetadataRetriever获取音频文件中的所有图片。当我有少量音频文件时,它工作正常,但当有很多文件时,例如100-150,我有 OutOfMemoryException 以下是我获取图片的代码: public class AudioDetails { private final static String TAG="NO PICTURE"; private String albums[]; private String du

我正在创建媒体播放器,并使用
MediaMetadataRetriever
获取音频文件中的所有图片。当我有少量音频文件时,它工作正常,但当有很多文件时,例如100-150,我有 OutOfMemoryException

以下是我获取图片的代码:

public class AudioDetails {
    private final static String TAG="NO PICTURE";
    private String albums[];
    private String durations[];
    private String singers[];
    private ArrayList<String> audioTitles;
    private ArrayList<String> audioPaths;
    private ArrayList<Bitmap> audioPic;
    private boolean tested=false;
    private MediaMetadataRetriever mediaDetails= new MediaMetadataRetriever();

    private AudioDetails(ArrayList<String> audioPaths){
        this.audioPaths=new ArrayList<>(audioPaths);
        albums=new String[audioPaths.size()];
        durations=new String[audioPaths.size()];
        singers=new String[audioPaths.size()];
        audioPic=new ArrayList<>();
        audioTitles=new ArrayList<>();
        processDuration();
    }

    private String getName(String filePath){
        StringBuilder audioName=new StringBuilder("");
        for(int i=filePath.length()-1;i>=0
            &&filePath.charAt(i)!='/';i--)
            audioName.append(filePath.charAt(i));
        audioName.reverse();
        try{
            if(filePath.contains(".mp3")
                ||filePath.contains(".ogg")){
               audioName.delete(filePath.length()-4,filePath.length()-1);
            }
        }catch (Throwable e){
            e.printStackTrace();
        }
        return audioName.toString();
    }

    public void processTitle(){
        String title;
        for(int i=0;i<audioPaths.size();i++){
            mediaDetails.setDataSource(audioPaths.get(i));
            title=mediaDetails.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR);
            audioTitles.add(title!=null&&!title.equals(" ")?title:"<unknown>");
        }
    }

    private void processDuration(){
        int min,sec;
        for(int i=0;i<audioPaths.size();i++){
            mediaDetails.setDataSource(audioPaths.get(i));
            sec=Integer.parseInt(mediaDetails.extractMetadata
                    (MediaMetadataRetriever.METADATA_KEY_DURATION)) / 1000;
            min=sec/60;
            sec=sec%60;
            durations[i]=Integer.toString(min)+":"+(sec>=10?
                    Integer.toString(sec):"0"+Integer.toString(sec));
        }
    }

    public void processPictures(){
        MediaMetadataRetriever mediaDetails= new MediaMetadataRetriever();
        for(int i=0;i<audioPaths.size();i++){
            mediaDetails.setDataSource(audioPaths.get(i));
            byte[] pic=mediaDetails.getEmbeddedPicture();
            if(pic!=null)
                audioPic.add(BitmapFactory.decodeByteArray(pic,0,pic.length));
            else{
                Log.e(TAG,"No picture");
                audioPic.add(null);
            }
            tested=true;
        }
    }

    public static AudioDetails create(ArrayList<String> audioPath){
        return new AudioDetails(audioPath);
    }

    public String[] getAudioDurations(){
        return durations;
    }

    public String[] getAudioSingers(){
        return singers;
    }

    public String[] getAlbums(){
        return albums;
    }

    public ArrayList<Bitmap> getAudioFrames(){
        return audioPic;
    }

    public ArrayList<String> getAudioTitles(){
        return audioTitles;
    }
}
公共类音频详细信息{
私有最终静态字符串标记=“无图片”;
私人字符串相册[];
私有字符串持续时间[];
私人弦乐歌手[];
私人ArrayList音频标题;
专用ArrayList音频路径;
私人ArrayList audioPic;
私有布尔测试=假;
私有MediaMetadataRetriever mediaDetails=新的MediaMetadataRetriever();
专用音频详细信息(ArrayList AudioPath){
this.audiopath=newarraylist(audiopath);
albums=新字符串[audioPaths.size()];
持续时间=新字符串[audiopath.size()];
singers=新字符串[AudioPath.size()];
audioPic=新的ArrayList();
audioTitles=新的ArrayList();
processDuration();
}
私有字符串getName(字符串文件路径){
StringBuilder audioName=新的StringBuilder(“”);
对于(int i=filePath.length()-1;i>=0
&&filePath.charAt(i)!=“/”;i--)
append(filePath.charAt(i));
audioName.reverse();
试一试{
if(filePath.contains(“.mp3”)
||filePath.contains(“.ogg”)){
audioName.delete(filePath.length()-4,filePath.length()-1);
}
}捕获(可丢弃的e){
e、 printStackTrace();
}
返回audioName.toString();
}
公共所有权(){
字符串标题;

对于(int i=0;i您是否尝试分配更多RAM?@Joehot200您在Android中无法分配更多RAM。在Android中,如果您将所有文件存储在一个数据结构中,在某一点上可能会超过此限制。所有这些文件的总大小是多少?这取决于设备上的音频文件数量。我找到了使用此选项可以解决此问题