0

J'essaie d'ajouter une chose dans mon application. Ce que j'essaye est quand l'utilisateur reçoit l'appel téléphonique ou l'utilisateur font l'appel téléphonique, en même temps l'enregistrement devrait commencer et l'enregistrement doit stocker dans la carte d'écart-type après avoir coupé l'appel.Appels sortants ne pas enregistrer

Questions
1) des travaux que des dossiers d'appel entrant parfois

2) sortant ne fonctionne pas

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private static final int REQUEST_CODE = 0; 
    private DevicePolicyManager mDPM; 
    private ComponentName mAdminName; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     PackageManager p = getPackageManager(); 
     p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

     try { 
      // Initiate DevicePolicyManager. 
      mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 
      mAdminName = new ComponentName(this, DeviceAdminDemo.class); 

      if (!mDPM.isAdminActive(mAdminName)) { 
       Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
       intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName); 
       intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Click on Activate button to secure your application."); 
       startActivityForResult(intent, REQUEST_CODE); 
      } else { 
       // mDPM.lockNow(); 
       // Intent intent = new Intent(MainActivity.this, 
       // TrackDeviceService.class); 
       // startService(intent); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (REQUEST_CODE == requestCode) { 
      Intent intent = new Intent(MainActivity.this, TService.class); 
      startService(intent); 
     } 
    } 

} 

TService

public class TService extends Service { 
    MediaRecorder recorder; 
    File audiofile; 
    String name, phonenumber; 
    String audio_format; 
    public String Audio_Type; 
    int audioSource; 
    Context context; 

    Timer timer; 
    Boolean offHook = false, ringing = false; 
    Toast toast; 
    Boolean isOffHook = false; 
    private boolean recordstarted = false; 

    private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; 
    private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; 
    private CallBr br_call; 




    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     Log.d("service", "destroy"); 

     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // final String terminate =(String) 
     // intent.getExtras().get("terminate");// 
     // intent.getStringExtra("terminate"); 
     // Log.d("TAG", "service started"); 
     // 
     // TelephonyManager telephony = (TelephonyManager) 
     // getSystemService(Context.TELEPHONY_SERVICE); // TelephonyManager 
     // // object 
     // CustomPhoneStateListener customPhoneListener = new 
     // CustomPhoneStateListener(); 
     // telephony.listen(customPhoneListener, 
     // PhoneStateListener.LISTEN_CALL_STATE); 
     // context = getApplicationContext(); 

     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION_OUT); 
     filter.addAction(ACTION_IN); 
     this.br_call = new CallBr(); 
     this.registerReceiver(this.br_call, filter); 

     // if(terminate != null) { 
     // stopSelf(); 
     // } 
     return START_NOT_STICKY; 
    } 

    public class CallBr extends BroadcastReceiver { 
     Bundle bundle; 
     String state; 
     String inCall, outCall; 
     public boolean wasRinging = false; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(ACTION_IN)) { 
       if ((bundle = intent.getExtras()) != null) { 
        state = bundle.getString(TelephonyManager.EXTRA_STATE); 
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
         inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         wasRinging = true; 
         Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show(); 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
         if (wasRinging == true) { 

          Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show(); 

          String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date()); 
          File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa1"); 
          if (!sampleDir.exists()) { 
           sampleDir.mkdirs(); 
          } 
          String file_name = "Record"; 
          try { 
           audiofile = File.createTempFile(file_name, ".amr", sampleDir); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
          System.out.println("PATH"+path); 

          recorder = new MediaRecorder(); 
//       recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 

          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); 
          recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
          recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
          recorder.setOutputFile(audiofile.getAbsolutePath()); 
          try { 
           recorder.prepare(); 
          } catch (IllegalStateException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          recorder.start(); 
          recordstarted = true; 
         } 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
         wasRinging = false; 
         Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show(); 
         if (recordstarted) { 
          recorder.stop(); 
          recordstarted = false; 
         } 
        } 
       } 
      } else if (intent.getAction().equals(ACTION_OUT)) { 
       if ((bundle = intent.getExtras()) != null) { 
        outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
        Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 

} 

Répondre

2

Supprimez ce if (wasRinging == true) de TService, ce qui était Rining Boolean vérifie si le téléphone sonnait quelque temps auparavant, c'est-à-dire lorsque le téléphone reçoit un appel, en cas d'appel sortant, il reste faux, la partie enregistreur est ignorée. Changez ça et ça devrait marcher.

Il suffit de remplacer votre code TService avec ce ..

public class TService extends Service { 
    MediaRecorder recorder; 
    File audiofile; 
    String name, phonenumber; 
    String audio_format; 
    public String Audio_Type; 
    int audioSource; 
    Context context; 

    Timer timer; 
    Boolean offHook = false, ringing = false; 
    Toast toast; 
    Boolean isOffHook = false; 
    private boolean recordstarted = false; 

    private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; 
    private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; 
    private CallBr br_call; 




    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     Log.d("service", "destroy"); 

     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // final String terminate =(String) 
     // intent.getExtras().get("terminate");// 
     // intent.getStringExtra("terminate"); 
     // Log.d("TAG", "service started"); 
     // 
     // TelephonyManager telephony = (TelephonyManager) 
     // getSystemService(Context.TELEPHONY_SERVICE); // TelephonyManager 
     // // object 
     // CustomPhoneStateListener customPhoneListener = new 
     // CustomPhoneStateListener(); 
     // telephony.listen(customPhoneListener, 
     // PhoneStateListener.LISTEN_CALL_STATE); 
     // context = getApplicationContext(); 

     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION_OUT); 
     filter.addAction(ACTION_IN); 
     this.br_call = new CallBr(); 
     this.registerReceiver(this.br_call, filter); 

     // if(terminate != null) { 
     // stopSelf(); 
     // } 
     return START_NOT_STICKY; 
    } 

    public class CallBr extends BroadcastReceiver { 
     Bundle bundle; 
     String state; 
     String inCall, outCall; 
     public boolean wasRinging = false; 
     public boolean didMakeACall = false; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(ACTION_IN)) { 
       if ((bundle = intent.getExtras()) != null) { 
        state = bundle.getString(TelephonyManager.EXTRA_STATE); 
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
         inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         wasRinging = true; 
         Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show(); 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
         if (wasRinging || didMakeACall) { 

          Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show(); 

          String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date()); 
          File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa1"); 
          if (!sampleDir.exists()) { 
           sampleDir.mkdirs(); 
          } 
          String file_name = "Record"; 
          try { 
           audiofile = File.createTempFile(file_name, ".amr", sampleDir); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
          System.out.println("PATH"+path); 

          recorder = new MediaRecorder(); 


          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); 
          recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
          recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
          recorder.setOutputFile(audiofile.getAbsolutePath()); 
          try { 
           recorder.prepare(); 
          } catch (IllegalStateException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          recorder.start(); 
          recordstarted = true; 
         } 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
         wasRinging = false; 
         Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show(); 
         if (recordstarted) { 
          recorder.stop(); 
          recordstarted = false; 
         } 
        } 
       } 
      } else if (intent.getAction().equals(ACTION_OUT)) { 
       if ((bundle = intent.getExtras()) != null) { 
        didMakeACall = true; 
        outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
        Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 

} 
+0

i force obtenez ce que vous say..sorry pour l'anglais – chris

+0

-moi de corriger votre code TService et vous obtiendrai ... –

+0

J'ai editted ma réponse, il suffit de remplacer votre code TService avec le mien. –

0

Je crains que la communauté ne voudrais pas que des liens externes ici, donc je poste mon projet de démonstration rapide ici ...

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    <service android:name=".TService"/> 
</application> 

MainActivity.java

Je commence TService dans sa méthode onCreate, s'il vous plaît noter que cela pourrait être une activité dans votre projet, ou tout contexte, vous pouvez démarrer un service à partir.

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     startService(new Intent(this, TService.class)); 
    } 
} 

et enfin, TService.java Je l'ai testé dans ce KitKat et Lollipop et cela fonctionne, pour les versions plus récentes, vous devez explicitement demander des autorisations Manifest pendant l'exécution et il devrait fonctionner aussi bien.

public class TService extends Service { 
    MediaRecorder recorder; 
    File audiofile; 
    String name, phonenumber; 
    String audio_format; 
    public String Audio_Type; 
    int audioSource; 
    Context context; 

    Timer timer; 
    Boolean offHook = false, ringing = false; 
    Toast toast; 
    Boolean isOffHook = false; 
    private boolean recordstarted = false; 

    private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; 
    private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; 
    private CallBr br_call; 




    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     Log.d("service", "destroy"); 

     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // final String terminate =(String) 
     // intent.getExtras().get("terminate");// 
     // intent.getStringExtra("terminate"); 
     // Log.d("TAG", "service started"); 
     // 
     // TelephonyManager telephony = (TelephonyManager) 
     // getSystemService(Context.TELEPHONY_SERVICE); // TelephonyManager 
     // // object 
     // CustomPhoneStateListener customPhoneListener = new 
     // CustomPhoneStateListener(); 
     // telephony.listen(customPhoneListener, 
     // PhoneStateListener.LISTEN_CALL_STATE); 
     // context = getApplicationContext(); 

     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION_OUT); 
     filter.addAction(ACTION_IN); 
     this.br_call = new CallBr(); 
     this.registerReceiver(this.br_call, filter); 

     // if(terminate != null) { 
     // stopSelf(); 
     // } 
     return START_NOT_STICKY; 
    } 

    public class CallBr extends BroadcastReceiver { 
     Bundle bundle; 
     String state; 
     String inCall, outCall; 
     public boolean wasRinging = false; 
     boolean didMakeACall = false; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(ACTION_IN)) { 
       if ((bundle = intent.getExtras()) != null) { 
        state = bundle.getString(TelephonyManager.EXTRA_STATE); 
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
         inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         wasRinging = true; 
         Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show(); 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
         if (wasRinging || didMakeACall) { 

          Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show(); 

          String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date()); 
          File sampleDir = new File(Environment.getExternalStorageDirectory(), "/MyRecorder"); 
          if (!sampleDir.exists()) { 
           sampleDir.mkdirs(); 
          } 
          String file_name = "Record"; 
          try { 
           audiofile = File.createTempFile(file_name, ".amr", sampleDir); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
          System.out.println("PATH"+path); 

          recorder = new MediaRecorder(); 
//       recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 

          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); 
          recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); 
          recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
          recorder.setOutputFile(audiofile.getAbsolutePath()); 
          try { 
           recorder.prepare(); 
          } catch (IllegalStateException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          recorder.start(); 
          recordstarted = true; 
         } 
        } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
         wasRinging = false; 
         Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show(); 
         if (recordstarted) { 
          recorder.stop(); 
          recordstarted = false; 
         } 
        } 
       } 
      } else if (intent.getAction().equals(ACTION_OUT)) { 
       if ((bundle = intent.getExtras()) != null) { 
        didMakeACall = true; 
        outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
        Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 

} 
+0

quel appareil vous avez utilisé ? – chris

+0

htc désir 820g kitkat runing et émulateur en cours d'exécution sucette, si vous rencontrez des problèmes, je peux faire un projet github et partager avec vous –

+0

j'utilise emulator kitkat..google nexus 7 api niveau 4.4.4 dans ce son ne fonctionne pas – chris