2014-11-18 4 views
0

Я хочу знать, как позвонить в android, без использования намерений.Сделать звонок в android

Я знаю, что это можно сделать с использованием намерений, но я искал developer.android.com, и об этой теме ничего нет.

Предположим, что я хочу написать новый номер для андроида. Как я могу это сделать?

Заранее спасибо

ответ

2

Чтобы сделать звонок,

private void performDial(String numberString) { 
if (!numberString.equals("")) { 
    Uri number = Uri.parse("tel:" + numberString); 
    Intent dial = new Intent(Intent.ACTION_CALL, number); 
    startActivity(dial); 
} 

}

Добавить это разрешение в манифесте.

<uses-permission android:name="android.permission.CALL_PHONE" /> 

см this.

Чтобы показать экран пользовательского дозвона, запись приемник для исходящего вызова

public class OutgoingCallReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(final Context context, final Intent intent) { 
    //this will receive the outgoing call 

} 
} 

добавить их манифест

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

<receiver android:name=.OutgoingCallReceiver" > 
    <intent-filter> 
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
</intent-filter> 

Чтобы показать вид сверху приложения Dialer при его запуске, используйте этот код внутри радиовещательного приемника

private WindowManager wm; 
    private static LinearLayout ly1; 
    private WindowManager.LayoutParams params1; 

    // onReceive function of the Broadcast Receiver 
    public void onReceive(Context arg0, Intent arg1) { 
      String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE); 

      // Adds a view on top of the dialer app when it launches. 
      if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
       wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
       params1 = new WindowManager.LayoutParams(
         LayoutParams.MATCH_PARENT, 
         LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | 
         WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
         WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
         PixelFormat.TRANSPARENT); 

       params1.height = 75; 
       params1.width = 512; 
       params1.x = 265; 
       params1.y = 400; 
       params1.format = PixelFormat.TRANSLUCENT; 

       ly1 = new LinearLayout(context); 
       ly1.setBackgroundColor(Color.BLACK); 
       ly1.setOrientation(LinearLayout.VERTICAL); 

       wm.addView(ly1, params1); 
      } 

      // To remove the view once the dialer app is closed. 
      if(arg1.getAction().equals("android.intent.action.PHONE_STATE")){ 
       String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE); 
       if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
        if(ly1!=null) 
        { 
         wm.removeView(ly1); 
         ly1 = null; 
        } 
       } 
      } 
     } 

Примечания: В приведенном выше примере генерируется вид, имеющий компоновку с черным фоном, имеющим размер, как показано выше. У вас есть свобода добавить любой макет в этот вид. Например, чтобы включить макет в представление, вы можете изменить приведенный выше код, чтобы включить следующий код.

ly1 = new LinearLayout(getApplicationContext()); 
    ly1.setOrientation(LinearLayout.HORIZONTAL); 


    View hiddenInfo = getLayoutInflater().inflate(R.layout.layout1, ly1, false); 
    ly1.addView(hiddenInfo); 

    wm.addView(ly1, params1); 

В манифесте вам необходимо включить следующие разрешения.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<action android:name="android.intent.action.PHONE_STATE"/

Примечание: Вы также можете вызвать активность из BroadcastReceiver вместо раздувания окно. Для этого используйте следующий код.

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     Intent intent = new Intent(context, CustomDialerActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
}, 2000); 

Я не уверен, что ваш пользовательский интерфейс всегда будет поверх установленного по умолчанию, так как система радиовещательный приемник и приемник оба пытаются отобразить его GUI на верхней части экрана. Мы не уверены, какой из них называется первым, но одна сложная работа, чтобы сделать ваш графический интерфейс сверху экрана, когда телефон звонит, вызываете свою активность через 1-2 секунды. Я использовал обработчик для этого.

+0

Так нет API для вызова номера? Как есть API в 'android.telephony.SmsManager' для отправки сообщений? Я должен написать приемник n намерений? – vfsoraki

+0

нет ави для совершения звонков – Darish

+0

Вам нужно совершать звонки, используя намерения. – Darish

1

Не уверен, что вы можете, разница между SMS и номеронабирателем заключается в том, что SMS можно сделать с огнем и забыть, набор должен быть чем-то, что говорит, пока он не будет выполнен.

Таким образом, используя намерение, вы можете startActivityForResult получить результат, а не получать ANR, ожидая возврата метода.

Итак, вы хотите сделать намерение Intent.ACTION_CALL с номером как его URI, а затем начать свою деятельность. Вам нужно будет <uses-permission android:name="android.permission.CALL_PHONE" />

См Android dialer application для примера

Смежные вопросы