有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用字节解码时java outofmemoryexception

我正在创建媒体播放器,我正在使用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;
    }
}

也许你知道怎么解决这个问题? 请帮帮我


共 (0) 个答案