مساعدة في تشغيل الصوت من خلال مجلد 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

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !