مساعدة في تشغيل الصوت من خلال مجلد raw
سالار • منذ 5 سنوات
السلام عليكم وانا اتصفح موقع GitHub وجدت سورس كود لبرنامج تنبيهات للصلاة وفيه ايضا تنبيهات لشهر رمضان المبارك ,, عندما اختار موعد التنبيه الخاص بشهر رمضان, وعند قدوم موعد التنبيه يعمل بدون مشكلة لكن لا يعمل الصوت الذي موجود في مجلد raw يعمل الصوت الافتراضي للتنبيه ,, مثل لما تقوم بعمل منبه في الجهاز يشتغل صوت التنبيه الافتراضي انا اريد لما يأتي موعد التنبيه يقوم بأطلاق الصوت الذي وضعته في مجلد raw
import android.Manifest;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import com.alimuzaffar.ramadanalarm.util.AlarmUtils;
import com.alimuzaffar.ramadanalarm.util.AppSettings;
import com.alimuzaffar.ramadanalarm.util.PrayTime;
import com.alimuzaffar.ramadanalarm.util.ScreenUtils;
import java.lang.ref.WeakReference;
import java.util.Calendar;
import java.util.TimeZone;
public class RingAlarmActivity extends AppCompatActivity implements Constants, View.OnClickListener, MediaPlayer.OnCompletionListener {
private Button mAlarmOff;
private TextView mPrayerName;
MediaPlayer mMediaPlayer = null;
Runnable mAutoStop = null;
Runnable mStartDua = null;
int mOriginalVolume = -1;
AudioManager mAudioManager;
AscendingAlarmHandler mAscHandler;
String mPrayerNameString = null;
AppSettings mSettings;
static int mAudioStream = AudioManager.STREAM_ALARM;
boolean mPreAlarm = false;
private NotificationManager mNotificationManager;
private AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
sendNotification(true);
stopAlarm();
finish();
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
startAlarm();
}
}
};
private PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
mOnAudioFocusChangeListener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_FULLSCREEN);
ScreenUtils.lockOrientation(this);
setContentView(R.layout.activity_ring_alarm);
setVolumeControlStream(AudioManager.STREAM_ALARM);
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTimeInMillis(System.currentTimeMillis());
mSettings = AppSettings.getInstance(this);
mPrayerName = (TextView) findViewById(R.id.prayer_name);
mPrayerNameString = getIntent().getStringExtra(EXTRA_PRAYER_NAME);
mPreAlarm = getIntent().hasExtra(EXTRA_PRE_ALARM_FLAG) && getIntent().getBooleanExtra(EXTRA_PRE_ALARM_FLAG, true);
if (mPreAlarm) {
String formatString = "%2$tl:%2$tM %2$tp %1$s";
if (mSettings.getTimeFormatFor(0) == PrayTime.TIME_24) {
formatString = "%2$tk:%2$tM %1$s";
}
mPrayerName.setText(String.format(formatString, mPrayerNameString, now));
} else {
mPrayerName.setText(getString(R.string.prayer_name_time, mPrayerNameString));
}
mAlarmOff = (Button) findViewById(R.id.alarm_off);
mAlarmOff.setOnClickListener(this);
try {
playAlarm();
} catch (Exception e) {
Log.e("RingAlarmActivity", e.getMessage(), e);
}
//if(PermissionUtil.hasSelfPermission(this, Manifest.permission.READ_PHONE_STATE)) {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
//}
}
private void playAlarm() throws Exception {
boolean loop = true;
Uri alert = null;
AssetFileDescriptor assetFileDescriptor = null;
if (!mPreAlarm && mSettings.getBoolean(AppSettings.Key.USE_ADHAN)) {
loop = false;
//mAudioStream = AudioManager.STREAM_MUSIC;
if (mPrayerNameString.equalsIgnoreCase(getString(R.string.fajr))) {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.adhan_fajr_trimmed);
} else {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.adhan_trimmed);
}
} else if (mSettings.getBoolean(AppSettings.Key.IS_RANDOM_ALARM)) {
//IF RANDOM RINGTONE IS SELECTED, USE IT.
alert = AlarmUtils.getRandomRingtone(this);
} else {
//IF A RINGTONE IS SELECTED, USE IT!
String uriStr = mSettings.getString(AppSettings.Key.SELECTED_RINGTONE);
if (TextUtils.isEmpty(uriStr)) {
alert = AlarmUtils.getAlarmRingtoneUri();
} else {
alert = Uri.parse(uriStr);
}
}
//if URI is not null, then it's a ringtone
mMediaPlayer = new MediaPlayer();
if (alert != null) {
mMediaPlayer.setDataSource(this, alert);
} else {
mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
}
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mOriginalVolume = mAudioManager.getStreamVolume(mAudioStream);
if (mOriginalVolume == 0) {
int volume = AlarmUtils.getAlarmVolumeFromPercentage(mAudioManager, mAudioStream, 50f);
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume, 0);
}
if (mSettings.getBoolean(AppSettings.Key.IS_ASCENDING_ALARM)) {
int volume = AlarmUtils.getAlarmVolumeFromPercentage(mAudioManager, mAudioStream, 20f);
mAudioManager.setStreamVolume(mAudioStream, volume, 0);
if (mAscHandler == null) {
mAscHandler = new AscendingAlarmHandler(mAudioManager);
}
mAscHandler.sendEmptyMessageDelayed(2, 10000);
mAscHandler.sendEmptyMessageDelayed(3, 20000);
mAscHandler.sendEmptyMessageDelayed(4, 30000);
mAscHandler.sendEmptyMessageDelayed(5, 40000);
}
mMediaPlayer.setLooping(loop);
mMediaPlayer.setAudioStreamType(mAudioStream);
mMediaPlayer.prepare();
if (assetFileDescriptor != null) {
mMediaPlayer.setOnCompletionListener(this);
}
int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener, mAudioStream, AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_GAIN) {
startAlarm();
}
}
private void startAlarm() {
mMediaPlayer.start();
mAlarmOff.postDelayed(mAutoStop = new Runnable() {
@Override
public void run() {
sendNotification();
mAlarmOff.performClick();
}
}, FIVE_MINUTES);
}
private void stopAlarm() {
if (mAscHandler != null) {
if (mAscHandler.hasMessages(20)) {
mAscHandler.removeMessages(20);
}
if (mAscHandler.hasMessages(40)) {
mAscHandler.removeMessages(20);
}
if (mAscHandler.hasMessages(60)) {
mAscHandler.removeMessages(20);
}
if (mAscHandler.hasMessages(80)) {
mAscHandler.removeMessages(20);
}
if (mAscHandler.hasMessages(100)) {
mAscHandler.removeMessages(20);
}
mAscHandler = null;
}
if (mAutoStop != null) {
mAlarmOff.removeCallbacks(mAutoStop);
mAutoStop = null;
}
if (mStartDua != null) {
mAlarmOff.removeCallbacks(mStartDua);
mStartDua = null;
}
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
if (mOriginalVolume != -1) {
mAudioManager.setStreamVolume(mAudioStream, mOriginalVolume, 0);
}
}
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
@Override
public void onClick(View v) {
stopAlarm();
finish();
}
@Override
public void onBackPressed() {
//Do nothing since we want to force the user
//to click the alarm button.
}
@Override
protected void onDestroy() {
stopAlarm();
super.onDestroy();
}
private void sendNotification() {
sendNotification(false);
}
private void sendNotification(boolean interrupted) {
Calendar now = Calendar.getInstance(TimeZone.getDefault());
now.setTimeInMillis(System.currentTimeMillis());
String formatString = " %1$tl:%1$tM %1$tp " + getString(R.string.alarm_timed_out, mPrayerName.getText().toString());
if (AppSettings.getInstance(this).getTimeFormatFor(0) == PrayTime.TIME_24) {
formatString = "%1$tk:%1$tM " + getString(R.string.alarm_timed_out, mPrayerName.getText().toString());
}
String title = interrupted? getString(R.string.alarm_interrupted) : getString(R.string.alarm_timed_out_only);
String body = String.format(formatString, now);
if (interrupted) {
body = mPrayerName.getText().toString();
}
mNotificationManager = (NotificationManager)
this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SalaatTimesActivity.class), PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(body))
.setContentText(body);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
@Override
public void onCompletion(MediaPlayer mp) {
//IF RAMADAN PLAY PRAYER, IF PRAYER ALREADY PLAYED, STOP
if (mSettings.getBoolean(AppSettings.Key.USE_ADHAN) &&
mSettings.getBoolean(AppSettings.Key.IS_RAMADAN)) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
AssetFileDescriptor assetFileDescriptor = null;
if (mPrayerNameString.equalsIgnoreCase(getString(R.string.fajr))) {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_sehri);
} else if (mPrayerNameString.equalsIgnoreCase(getString(R.string.maghrib))) {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_iftar);
}
if (assetFileDescriptor == null) {
stopAlarm();
return;
}
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
mMediaPlayer.setAudioStreamType(mAudioStream);
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopAlarm();
}
});
mMediaPlayer.setLooping(false);
mMediaPlayer.prepare();
mAlarmOff.postDelayed(mStartDua = new Runnable() {
@Override
public void run() {
mMediaPlayer.start();
}
}, 3000);
} catch (Exception e) {
Log.e("RingAlarmActivity", e.getMessage(), e);
}
}
}
private static class AscendingAlarmHandler extends Handler {
WeakReference<AudioManager> mAudioManagerRef = null;
public AscendingAlarmHandler(AudioManager audioManager) {
mAudioManagerRef = new WeakReference<>(audioManager);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
AudioManager audioManager = mAudioManagerRef.get();
if (audioManager != null) {
int what = msg.what;
float percentage = (float) what * 20f;
int volume = AlarmUtils.getAlarmVolumeFromPercentage(audioManager, mAudioStream, percentage);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume, 0);
}
}
}
}
هنا في هذه الاسطر, الاصوات التي قمت بأختيارها من مجلد raw لكن عندما يأتي موعد التنبيه لا تعمل هذه الاصوات تشتغل النغمة الافتراضية للتنبيه
if (mPrayerNameString.equalsIgnoreCase(getString(R.string.fajr))) {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_sehri);
} else if (mPrayerNameString.equalsIgnoreCase(getString(R.string.maghrib))) {
assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_iftar);
}
كلمات دليلية:
android
ساعد بالإجابة
"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !