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中,如果您将所有文件存储在一个数据结构中,在某一点上可能会超过此限制。所有这些文件的总大小是多少?这取决于设备上的音频文件数量。我找到了使用此选项可以解决此问题