حياك الله أخي مصطفى، شُكراً على تفاعلك.
جربت الطريقة التي وضحتها ولكن لا تزال تظهر نفس المشكلة.
اعتذر عن الازعاج، ولكن بسبب ضعف الانترنت عندنا، وعدم توفر الشبكة في كل الأماكن لدي اضطر لوضع السؤال ورفعه بدلاً من البحث والتنقل بين عدة مواقع والتجربة للوصول للحل، ولكن الحمد لله بعد عدة محاولات للبحث عندما توفرت لي الشبكة وجدت الحل، بعد تجربة عدد من الحلول التي وجدتها.
خلاصة المشكلة:
انه يتم ضغط الملفات المرفقة مع حزمة apk لتوفير مساحة التخزين كما فهمت من هذا النص:
There is a limitations on opening compressed files in the assets folder. This is because uncompressed files can be directly memory mapped into the processes virtual address space, therefore avoiding needing the same amount of memory again for decompression.
وهذا يسبب مشكلة في قرائتها بالطرق السابقة، ولهذا لا بد من استعمال الأكواد التالية، وكما أسلفت في السؤال فالمشكلة في دالة load() وبالتخصيص في الوسيط الخاص بتحديد الملف الصوتي، فالاكواد التي وضعتها في السؤال لا مشكلة فيها الا في المكان المحدد وحلها كالاتي:
AssetFileDescriptor afd = null;
try {
//انشاء ملف في الكاش
File cache = new File(getCacheDir(), "click.wav");
//التأكد من الملف غير موجود في الكاش، لكي لا يتم انشاءه في كل مرة احتجنا اليه
if (!cache.exists()) {
//نسخ ملف الصوت من ملف assets الى الملف الذي تم انشاءه في الكاش
//copyInputStreamToFile(getAssets().open("click.wav"), cache);
//نسخ ملف الصوت من ملف raw الى الملف الذي تم انشاءه في الكاش
copyInputStreamToFile(getResources().openRawResource(R.raw.click), cache);
}
//قراءة الملف الصوتي من الكاش
afd = new AssetFileDescriptor(ParcelFileDescriptor.open(cache, ParcelFileDescriptor.MODE_READ_ONLY), 0, AssetFileDescriptor.UNKNOWN_LENGTH);
} catch (Exception e) {
new AlertDialog.Builder(this).setMessage(e.getMessage()).show();
}
//تحميل SoundPool بالملف الصوتي
sound1 = soundPool.load(afd , 0);
}
// دالة عملها نسخ الملف من مجلد raw او مجلد assets الى المسار المحدد في الوسيط file
private void copyInputStreamToFile(InputStream in, File file) {
BufferedOutputStream bfos = null;
try {
bfos = new BufferedOutputStream(new FileOutputStream(file));
byte[] buf = new byte[4096];
int len;
while ((len = in.read(buf)) != -1) {
bfos.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bfos != null) {
bfos.close();
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}}
ملاحظات:
1) وجدت الحل في الاجابة على سؤال مشابه لسؤالي على موقع stackoverflow:
https://stackoverflow.com/questions/6186866/java-io-filenotfoundexception-this-file-can-not-be-opened-as-a-file-descriptor
2) قمت بشرح الكود على شكل تعليقات ليسهل فهمه لمن يطلع عليه
2) هذا الحل ينطبق على كل انواع الملفات الموجودة في raw او assets سواء اكانت صوتيه او صور او ملفات نصية ...
شكرا لك أخي ياسر على تفاعلك.
جربت تغيير المسار الى Download وحدثت نفس المشكلة، وجربت ايظا مسار Android وحدثت نفس المشكلة ايظاً.
بالنسبة لانشاء KeyStor بالحاسوب، انشأته باستخدام بيئة Android Studio وعندما قمت بمحاولة تصدير تطبيقي بواسطته ظهرت لي الرسالة
Invalid keystore credentials!
كانت المشكلة أن لغة الهاتف لدي هي اللغة العربية، عندما قمت بتغييرها للغة الانجليزية تمت بنجاح.
على العموم شكراً لك، لقد حُلَّت مشكلتي.