我一直在开发一个应用程序,该应用程序需要播放声音,并且具有大量.wav格式的声音文件,其大小接近1GB。我已按照官方文档制作扩展文件。
首先,我制作了一个 0 次压缩的 .zip 文件,所有.wav文件都在该文件下(没有任何子文件夹。然后我将.zip文件夹重命名为 .obb。之后,我将那个.obb文件放在共享存储obb文件夹下的应用程序文件夹中(com.moinul.app 是我的软件包名称,所以文件夹名称是它,扩展文件也被命名为main.1.com.moinul.app.obb (
问题是当我尝试从扩展文件中读取文件时,出现空指针异常:
try
{
String param = (String) v.getTag();
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, 1, 0);
AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("p25_1.wav");
MediaPlayer mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(fd.getFileDescriptor());
mPlayer.prepare();
mPlayer.start();
}
catch (Exception e)
{
Log.w(TAG, e.getMessage() + "");
e.printStackTrace();
}
我收到异常说 fd 为空。任何帮助将不胜感激。谢谢
尝试使用:AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("assets/p25_1.wav");
尝试'公共类测试扩展活动 {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String TAG = "Test";
Context context = this;
try {
MediaPlayer mediaPlayer = new MediaPlayer();
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, 1, 0);
AssetFileDescriptor assetFileDescriptor = expansionFile.getAssetFileDescriptor("assets/p25_1.wav");
if (assetFileDescriptor != null) {
final FileInputStream fis = assetFileDescriptor.createInputStream();
if (fis != null) {
mediaPlayer.setDataSource(fis.getFD());
fis.close();
mediaPlayer.prepare();
mediaPlayer.start();
} else {
Log.w(TAG, "/fis: null");
}
}
} catch (Exception e) {
Log.w(TAG, e.getMessage() + "");
}
}
}'
所以它终于工作了。换成 :
AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("Sounds/p25_1.wav");
它现在正在工作。奇怪的是,我不得不添加 Sounds,这是压缩前的文件夹名称(我实际上压缩了这个文件夹,所有.wav都在它下面(。我认为压缩器在.zip内制作了另一个子文件夹。
无论如何,感谢您的帮助。