1

내 목표는 사용자에게 전화를 거는 사람을 알리는 것입니다. 서비스에서이 작업에 TextToSpeech를 사용하고 있습니다.android에서 통화 중에 벨소리 볼륨을 음소거

mAudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
      volume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0); 
      } else { 
       mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); 
      } 

나는 이것이 추가하는 코드 만 곳임을 알고

그래서 나는 통화 중에 벨소리 볼륨을 소거하기로 결정? 방송 수신기를 확장하는 클래스에 있습니까?

내 문제는 통화가 발생할 때마다 전화벨이 정상적으로 울립니다. 나는 벨소리를 음소거 말을 내 TextToSpeech 객체를 만들고 싶어

내 매니페스트 파일은 다음과 같다 : 방송 수신기를 확장

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.sairaman63yahoo.callerannouncer"> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <receiver android:name=".CalReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
     </intent-filter> 


    </receiver> 
    <service android:name=".CallService" android:enabled="true"></service> 

    <activity 
     android:name=".DetectPhoneCallsActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

내 PhoneCallReceiver 클래스는 다음과 같습니다

public abstract class PhoneCallReceiverbase extends BroadcastReceiver { 

private int mRingVolume=0; 
public static int lastState= TelephonyManager.CALL_STATE_IDLE; 
public static Date callstartTime; 
public static boolean isIncoming; 
public static String savedNumber; 
private static AudioManager mAudioManager; 
private int volume; 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")){ 
     savedNumber=intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); 
    } 
    else 
    { 
     String stateStr=intent.getExtras().getString(TelephonyManager.EXTRA_STATE); 
     String number=intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
     int state=0; 
     if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) 
      state=TelephonyManager.CALL_STATE_IDLE; 
     else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) 
      state=TelephonyManager.CALL_STATE_OFFHOOK; 
     else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      state= TelephonyManager.CALL_STATE_RINGING; 
      onCallStateChaned(context,state,number); 

     } 



    } 
} 

private void onCallStateChaned(Context context, int state, String number) { 
    if(lastState==state){ 
     return; 
    } 

    // mAudioManager.setStreamMute(AudioManager.STREAM_RING, true); 

    switch (state){ 
     case TelephonyManager.CALL_STATE_RINGING: 
     // AudioManager manager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
      isIncoming = true; 
      callstartTime = new Date(); 
      savedNumber = number; 
      onIncomingCallReceived(context, number, callstartTime); 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      //offhook are pickup calls....nothing is done on them 
      if(lastState!=TelephonyManager.CALL_STATE_RINGING) 
      { 
       isIncoming=false; 
       callstartTime=new Date(); 
       onOutGoingCallStarted(context,number,callstartTime); 

      } 
      else 
      { 
       isIncoming=true; 
       callstartTime=new Date(); 
       onIncomingCallAnswered(context,number,callstartTime); 

      } 
      break; 
     case TelephonyManager.CALL_STATE_IDLE: 
      if(lastState==TelephonyManager.CALL_STATE_RINGING){ 
       onMissedCall(context,number,callstartTime); 
      } 
      else if(isIncoming) 
       onIncomingCallEnded(context,number,callstartTime,new Date()); 
      else 
       onOutGoingCallEnded(context,number,callstartTime,new Date()); 
      break; 
    } 
    lastState=state; 

} 

protected abstract void onIncomingCallReceived(Context context,String number,Date start); 
protected abstract void onIncomingCallAnswered(Context context,String number,Date start); 
protected abstract void onIncomingCallEnded(Context context,String number,Date start,Date end); 
protected abstract void onOutGoingCallStarted(Context context,String number,Date start); 
protected abstract void onOutGoingCallEnded(Context context,String number,Date start,Date end); 
protected abstract void onMissedCall(Context context,String number,Date start); 
} 

내 CallReceiver 클래스 PhoneCallReceiver 클래스를 확장 한 클래스는 다음과 같습니다.

public class CalReceiver extends PhoneCallReceiverbase { 

TextToSpeech toSpeech; 
private AudioManager mAudioManager; 
private int volume; 


@Override 
protected void onIncomingCallReceived(Context context, String number, Date start) { 

    mAudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
    volume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0); 
    } else { 
     mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); 
    } 
    Intent intent1 = new Intent(context.getApplicationContext(), CallService.class); 
    intent1.putExtra("call", "CALL RECEIVED"); 
    context.startService(intent1); 

    // Toast.makeText(context, "CALL RECIEVED", Toast.LENGTH_LONG).show(); 


    final ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
    final List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); 

    for (ActivityManager.RunningServiceInfo runningServiceInfo : services) { 
     if (runningServiceInfo.service.getClassName().equals(CallService.class)) { 
      Log.v("SERVICE", "RUNNING"); 

     } 
    } 
} 



@Override 
protected void onIncomingCallAnswered(Context context, String number, Date start) { 

} 

@Override 
protected void onIncomingCallEnded(Context context, String number, Date start, Date end) { 
    Toast.makeText(context,"CALL ENDED",Toast.LENGTH_LONG).show(); 

} 

@Override 
protected void onOutGoingCallStarted(Context context, String number, Date start) { 
    Toast.makeText(context,"CALL STARTED",Toast.LENGTH_LONG).show(); 




} 

@Override 
protected void onOutGoingCallEnded(Context context, String number, Date start, Date end) { 
    Toast.makeText(context,"CALL ENDED",Toast.LENGTH_LONG).show(); 
} 

@Override 
protected void onMissedCall(Context context, String number, Date start) { 
    Toast.makeText(context,"MISSED CALL",Toast.LENGTH_LONG).show(); 
} 
} 

Fi 뭔가를 말하고 nally, 내 서비스 클래스입니다 : 통화 중 신호음 볼륨을 음소거하고 TextToSpeech 객체를 만들 무언가를 말하고 연설 후 벨소리 볼륨을 계속하려면 :

목표 :

public class CallService extends Service implements TextToSpeech.OnInitListener,TextToSpeech.OnUtteranceCompletedListener { 

int volume=0; 
private TextToSpeech tts; 
private String spoken="call started sir!"; 
private AudioManager mAudioManager; 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    tts=new TextToSpeech(this,this); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    spoken=(String)intent.getExtras().get("call"); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onInit(int status) { 
if(status==TextToSpeech.SUCCESS) 
{ 
    // mAudioManager.setStreamMute(AudioManager.STREAM_RING, true); 
    tts.setLanguage(Locale.ENGLISH); 
    // toSpeech.speak("CALL IS COMING",TextToSpeech.QUEUE_FLUSH,null); 
    if (Build.VERSION.RELEASE.startsWith("5")) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      tts.speak(spoken, TextToSpeech.QUEUE_FLUSH, null, null); 
     } 
    } 
    else { 
     tts.speak(spoken, TextToSpeech.QUEUE_FLUSH, null); 
    } 
} 
} 

@Override 
public void onUtteranceCompleted(String utteranceId){ 
mAudioManager.setStreamMute(AudioManager.STREAM_RING, false); 
mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 
volume, AudioManager.FLAG_ALLOW_RINGER_MODES); 
    stopSelf(); 
} 
} 

쿼리를 요약

문제 : 1) 벨소리 볼륨을 음소거하는 코드를 추가 할 위치 2) callReceiver 클래스의 코드를 onIncomingCallReceived()에 추가했지만 작동하지 않는 것 같습니다. 벨소리가 아닙니다. 정지

도와주세요!

나는 그 긴 질문을 알고 있지만 여기에 붙어 있습니다. 도움에 감사드립니다!

+0

내가 아는 한 벨소리는 멈추지 않고 말을 멈출 수 있습니다. 멈 추면 다시 시작할 수 없습니다. – brandall

+0

그래서 어떻게 멈추게합니까? – Raman

답변

1

제 의견에 말했듯이 제 신청서가 당신이 원하는대로 할 수있는 방법을 찾지 못했습니다. TTS가 전화를 알리고 복잡한 보류중인 통화와의 추가 상호 작용을 모니터링 한 후 사용자의 벨소리를 복제하는 것 외에는 현재 벨소리를 음소거 할 수 없었습니다.

이 작업을 수행하려면 :

public static void muteRinger(final Context ctx, final boolean mute) { 

    final AudioManager am = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE); 

    switch (am.getRingerMode()) { 

     case AudioManager.RINGER_MODE_NORMAL: 
      Log.i("TAG", "getRingerMode: RINGER_MODE_NORMAL"); 
      break; 
     case AudioManager.RINGER_MODE_SILENT: 
      Log.i("TAG", "getRingerMode: RINGER_MODE_NORMAL"); 
      break; 
     case AudioManager.RINGER_MODE_VIBRATE: 
      Log.i("TAG", "getRingerMode: RINGER_MODE_NORMAL"); 
      break; 
     default: 
      Log.e("TAG", "getRingerMode: Default??"); 
      break; 
    } 


    if(mute){ 
     Log.i("TAG", "muting ringtone"); 

    // Save am.getRingerMode() to the shared preferences as the user's default    

     try { 
      am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } else { 
     Log.i("TAG", "restoring ringtone"); 

     try { 
      am.setRingerMode(// The default you previously saved); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

분명히, 올바르게 사용자의 벨소리 설정을 복원하지 않을 경우, 당신은 짜증이 사용자를해야하고 그들이 중요한 전화를 놓칠 경우에는 문제가 될 수 있습니다 .. ....

+0

기본값을 저장하려는 위치의 위치가 변경되었습니다. – brandall

관련 문제