android: создание нескольких телефонных звонков из приложения android [duplicate]

просто добавить еще один пример того, что лямбда может сделать без использования карты:

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20
126
задан 5 revs, 5 users 61% 14 December 2015 в 06:59
поделиться

21 ответ

Вот мой пример: сначала пользователь должен написать номер, который он хочет набрать, а затем нажимает кнопку вызова и направляется на телефон. После отмены вызова пользователь отправляется обратно в приложение. Для этого кнопка должна иметь метод onClick («makePhoneCall» в этом примере) в xml. Вам также необходимо зарегистрировать разрешение в манифесте.

Манифест

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

Активность

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class PhoneCall extends Activity {

    EditText phoneTo;

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

        phoneTo = (EditText) findViewById(R.id.phoneNumber);

    }
    public void makePhoneCall(View view) {




        try {
            String number = phoneTo.getText().toString();
            Intent phoneIntent = new Intent(Intent.ACTION_CALL);
            phoneIntent.setData(Uri.parse("tel:"+ number));
            startActivity(phoneIntent);


        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(PhoneCall.this,
                    "Call failed, please try again later!", Toast.LENGTH_SHORT).show();
        }
    }

}

XML

 <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/phoneNumber"
        android:layout_marginTop="67dp"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Call"
        android:id="@+id/makePhoneCall"
        android:onClick="makePhoneCall"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
6
ответ дан 2 revs 19 August 2018 в 07:08
поделиться
  • 1
    вы даже не то, о чем говорите. READ_PHONE_STATE - вы не используете его в своем примере кода, почему вы его добавили? конечно, он вернет вас к активности вашего приложения, если вы нажмете кнопку отмены, но автор вопроса спросил, как вернуться к активности после того, как звонок был принят – user924 5 April 2018 в 18:03

Попробуйте использовать:

finish();

в конце действия. Он перенаправит вас на предыдущую активность.

2
ответ дан 2 revs, 2 users 55% 19 August 2018 в 07:08
поделиться

@Dmitri Novikov, FLAG_ACTIVITY_CLEAR_TOP удаляет любой активный экземпляр поверх нового. Таким образом, он может завершить старый экземпляр до завершения процесса.

6
ответ дан 2 revs, 2 users 67% 19 August 2018 в 07:08
поделиться

Чтобы вернуться к вашему Activity, вам нужно будет прослушать TelephonyStates. На listener вы можете отправить Intent, чтобы повторно открыть ваш Activity, когда телефон не работает.

По крайней мере, как я это сделаю.

24
ответ дан 2 revs, 2 users 80% 19 August 2018 в 07:08
поделиться
  • 1
    вы можете избежать этого, используя другой метод. если вы создадите ContentObserver, который наблюдает за журналом вызовов Android, приложение не будет запускаться до тех пор, пока не будет выполнено изменение журнала вызовов. я действительно должен был сбросить PhoneStateListener в пользу этой модели, так как моему приложению нужны данные журнала звонков, и слушатель возвращался до того, как эти изменения были сделаны. pastebin.com/bq2s9EVa – moonlightcheese 28 September 2011 в 16:48
  • 2
    @ Андре: ваша ссылка, похоже, сломана – aggregate1166877 11 October 2012 в 13:28
  • 3
    Я бы дал вам миллион репутации (если бы у меня было много :)) Спасибо, что сделал мой день! – keybee 22 August 2013 в 19:06
  • 4
    пожалуйста, поделитесь своим кодом? – Pierre 9 January 2014 в 21:41
  • 5
    Проблема со ссылками, которые я говорю! – Dheeraj Bhaskar 20 March 2014 в 21:38
  • 6
    ссылка пожалуйста !!! – S.Thiongane 8 April 2014 в 13:33

используйте PhoneStateListener, чтобы увидеть, когда вызов завершен. вам, скорее всего, придется активировать действия слушателя, чтобы дождаться начала вызова (дождитесь, пока он снова изменится с PHONE_STATE_OFFHOOK на PHONE_STATE_IDLE), а затем напишите некоторый код, чтобы вернуть ваше приложение в состояние IDLE.

вам может понадобиться запустить прослушиватель в службе, чтобы убедиться, что он остается включенным, и ваше приложение перезапускается. некоторый пример кода:

EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

Определение приемника:

private class EndCallListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
            //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
            Log.i(LOG_TAG, "OFFHOOK");
        }
        if(TelephonyManager.CALL_STATE_IDLE == state) {
            //when this state occurs, and your flag is set, restart your app
            Log.i(LOG_TAG, "IDLE");
        }
    }
}

В вашем файле Manifest.xml добавьте следующее разрешение:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
105
ответ дан 2 revs, 2 users 91% 19 August 2018 в 07:08
поделиться
  • 1
    Не забудьте разрешение. ;) – Gp2mv3 26 January 2012 в 19:58
  • 2
    Как отметил Gp2mv3, не забудьте добавить разрешение READ_PHONE_STATE в AndroidManifest.xml. – Neeko 30 June 2012 в 20:06
  • 3
    @moonlightcheese Можете ли вы добавить код, чтобы вернуться в наше приложение из приложения-приложения? – Geek 15 July 2013 в 18:16
  • 4
    это опасно, потому что он всегда будет открывать вашу активность приложения каждый раз, когда вы вызываете – user924 5 April 2018 в 18:05

Шаги:

1) Добавьте необходимые разрешения в файл Manifest.xml.

<!--For using the phone calls -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!--For reading phone call state-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2) Создайте прослушиватель для изменения состояния телефона.

public class EndCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
    if(TelephonyManager.CALL_STATE_RINGING == state) {
    }
    if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
        //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
    }
    if(TelephonyManager.CALL_STATE_IDLE == state) {
        //when this state occurs, and your flag is set, restart your app
    Intent i = context.getPackageManager().getLaunchIntentForPackage(
                            context.getPackageName());
    //For resuming the application from the previous state
    i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    //Uncomment the following if you want to restart the application instead of bring to front.
    //i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(i);
    }
}
}

3) Инициализируйте слушателя в своем OnCreate

EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

, но если вы хотите возобновить свое последнее состояние приложения или вернуть его из заднего стека, замените FLAG_ACTIVITY_CLEAR_TOP с FLAG_ACTIVITY_SINGLE_TOP

Ссылка на это Ответ

0
ответ дан 3 revs 19 August 2018 в 07:08
поделиться

Когда используется PhoneStateListener, необходимо убедиться, что PHONE_STATE_IDLE после PHONE_STATE_OFFHOOK используется для запуска действия, которое должно быть выполнено после вызова. Если срабатывание триггера происходит, увидев PHONE_STATE_IDLE, вы закончите выполнение этого перед вызовом. Поскольку вы увидите изменение состояния PHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.

2
ответ дан 3 revs, 3 users 50% 19 August 2018 в 07:08
поделиться
  • 1
    не удается ли приложение останавливаться при открытии текущего экрана вызова? – lisovaccaro 21 January 2013 в 21:30
  • 2
    Объект прослушивателя, установленный для прослушивания TelephonyManager с помощью ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(new PhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE), продолжит прослушивание состояния телефона и будет активным до тех пор, пока явно не остановится с ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE) – PonMaran 14 September 2014 в 05:42

Это касается вопроса, заданного стартером.

Проблема с вашим кодом заключается в том, что вы не правильно передаете номер.

Код должен быть:

private OnClickListener next = new OnClickListener() {

     public void onClick(View v) {
        EditText num=(EditText)findViewById(R.id.EditText01); 
        String number = "tel:" + num.getText().toString().trim();
        Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(number)); 
        startActivity(callIntent);
    }
};

Не забудьте добавить разрешение в файл манифеста.

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

или

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

для номера экстренной службы в случае использования DIAL.

49
ответ дан 5 revs, 5 users 73% 19 August 2018 в 07:08
поделиться
  • 1
    Мне тяжело видеть, как ваш код отличается от кода в исходном вопросе – Ilya Saunkin 22 August 2011 в 22:35
  • 2
    Код не отличается. Вам нужно добавить разрешение в файл манифеста. – Pria 1 March 2012 в 14:08
  • 3
    android.permission.CALL_PRIVILEGED Разрешение предоставляется только системным приложениям, недоступным на уровне приложения. – CoDe 2 March 2014 в 13:25
  • 4
    и что это? он не вернется к вашей деятельности – user924 5 April 2018 в 17:59

Это решение с моей точки зрения:

ok.setOnClickListener(this);
@Override
public void onClick(View view) {
    if(view == ok){
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + num));
        activity.startActivity(intent);

    }

Конечно, в определении Activity (class) вам необходимо реализовать View.OnClickListener.

6
ответ дан cikabole 19 August 2018 в 07:08
поделиться
   Intent callIntent = new Intent(Intent.ACTION_CALL);
   callIntent .setData(Uri.parse("tel:+91-XXXXXXXXX"));
   startActivity(callIntent );

для получения дополнительной информации нажмите здесь http://androiddhina.blogspot.in/2015/10/how-to-make-phone-call-from-android.html

1
ответ дан Dhina k 19 August 2018 в 07:08
поделиться

Внутри PhoneStateListener после того, как вы увидели, что вызов закончен, лучше использовать:

Intent intent = new Intent(CallDispatcherActivity.this, CallDispatcherActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

, где CallDispatcherActivity - это активность, в которой пользователь запустил вызов (диспетчеру обслуживания такси, в моем случае). Это просто удаляет приложение телефонии Android сверху, пользователь возвращается вместо уродливого кода, который я видел здесь.

3
ответ дан Dmitri Novikov 19 August 2018 в 07:08
поделиться
  • 1
    И не забудьте удалить слушателя после завершения телефонного звонка, например: ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE); – Dmitri Novikov 28 June 2012 в 16:59
  • 2
    Я попытался использовать ваш подход, но активность (называемая ControlPanel) не возобновляется. Дисплей продолжает показывать интерфейс телефонного набора, а регистраторы на входах onResume и onNewIntent в ControlPanel полностью молчат. Вот цель: Intent intentRestart = new Intent(ControlPanel.this, ControlPanel.class);. Я должен указать, что PhoneStateListener также находится в ControlPanel. I.e., Моя цель - восстановить пользовательский интерфейс до состояния, в котором оно было до начала телефонного звонка. Какие-либо предложения? – PeteH 21 April 2013 в 06:39
  • 3
    Попробуйте войти в свою реализацию PhoneStateListener. – Dmitri Novikov 22 April 2013 в 10:01

// в setonclicklistener поместите этот код:

EditText et_number=(EditText)findViewById(R.id.id_of_edittext); 
String my_number = et_number.getText().toString().trim();
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(my_number)); 
startActivity(callIntent);

// даем разрешение для вызова в манифесте:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
2
ответ дан Hiren Patel 19 August 2018 в 07:08
поделиться

Если вы собираетесь использовать прослушиватель, вам также нужно будет добавить это разрешение в манифест.

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
5
ответ дан martincm 19 August 2018 в 07:08
поделиться

При запуске вашего вызова это выглядит нормально.

Существует разница между Android-хостом 11+ и ниже приложением вашего приложения на передний план.

Android 10 или меньше вы нужно начать новое намерение, android 11+ вы просто используете BringTaskToFront

В состоянии вызова IDLE:

if (Build.VERSION.SDK_INT >= 11) {
    ActivityManager am = (ActivityManager) activity.getSystemService(Activity.ACTIVITY_SERVICE);
    am.moveTaskToFront(MyActivity.MyActivityTaskId, ActivityManager.MOVE_TASK_WITH_HOME);
} else {
    Intent intent = new Intent(activity, MyActivity.class);
    activity.startActivity(intent);
}

Я установил MyActivity.MyActivityTaskId при совершении вызова моя деятельность как это, это не работает, установите эту переменную на странице родительской активности страницы, на которую вы хотите вернуться.

MyActivity.MyActivityTaskId = this.getTaskId();

MyActivityTaskId - статическая переменная в моем классе активности

public static int MyActivityTaskId = 0;

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

Я также установил некоторые вещи в AndroidManifest.xml :

/*Dont really know if this makes a difference*/
<activity android:name="MyActivity" android:taskAffinity="" android:launchMode="singleTask" />

и разрешения:

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

Пожалуйста, задавайте вопросы, если или когда вы застряли.

0
ответ дан Pierre 19 August 2018 в 07:08
поделиться

Идеальный учебник здесь ! Всегда проверяйте этот блог, потому что у него много отличных уроков!

3
ответ дан Raphael Oliveira 19 August 2018 в 07:08
поделиться
  Intent callIntent = new Intent(Intent.ACTION_CALL);  
  callIntent.setData(Uri.parse("tel:"+number));  
   startActivity(callIntent);   

 **Add permission :**

 <uses-permission android:name="android.permission.CALL_PHONE" />          
3
ответ дан ritesh4326 19 August 2018 в 07:08
поделиться

Добавьте это ваш xml: android:autoLink="phone"

1
ответ дан Roman Marius 19 August 2018 в 07:08
поделиться

Я нашел EndCallListener наиболее функциональный пример, чтобы описать поведение (finish (), call, restart). Я добавил несколько SharedPreferences, чтобы у Listener была ссылка для управления этим поведением.

My OnClick, initialise и EndCallListener реагируют только на вызовы из приложения. Другие вызовы игнорируются.

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class EndCallListener extends PhoneStateListener {

private String TAG ="EndCallListener";
private int     LAUNCHED = -1;

SharedPreferences prefs = PreferenceManager
                            .getDefaultSharedPreferences(
                                myActivity.mApp.getBaseContext());

SharedPreferences.Editor _ed = prefs.edit();

@Override
    public void onCallStateChanged(int state, String incomingNumber) {
    String _prefKey = myActivity.mApp                          
                      .getResources().getString(R.string.last_phone_call_state_key),
    _bPartyNumber = myActivity.mApp                           
                      .getResources().getString(R.string.last_phone_call_bparty_key);

    int mLastCallState = prefs.getInt(_prefKey, LAUNCHED);

    //Save current call sate for next call
    _ed.putInt(_prefKey,state);
    _ed.commit();

        if(TelephonyManager.CALL_STATE_RINGING == state) {
            Log.i(TAG, " >> RINGING, number: " + incomingNumber);
        }
        if(TelephonyManager.CALL_STATE_IDLE == state && mLastCallState != LAUNCHED ) {
            //when this state occurs, and your flag is set, restart your app

            if (incomingNumber.equals(_bPartyNumber) == true) {
                //Call relates to last app initiated call
            Intent  _startMyActivity =  
               myActivity.mApp                               
               .getPackageManager()                                  
               .getLaunchIntentForPackage(
                 myActivity.mApp.getResources()
                 .getString(R.string.figjam_package_path));

_startMyActivity.setAction(                                     
        myActivity.mApp.getResources()
        .getString(R.string.main_show_phone_call_list));

                myActivity.mApp
                        .startActivity(_startMyActivity);
                Log.i(TAG, "IDLE >> Starting MyActivity with intent");
            }
            else
                Log.i(TAG, "IDLE after calling "+incomingNumber);

        }

    }
}

добавьте их в strings.xml

<string name="main_show_phone_call_list">android.intent.action.SHOW_PHONE_CALL_LIST</string>
<string name="last_phone_call_state_key">activityLpcsKey</string>
<string name="last_phone_call_bparty_key">activityLpbpKey</string>

и что-то вроде этого в вашем манифесте, если вам нужно вернуться к внешнему виду перед вызовом

  <activity android:label="@string/app_name" android:name="com.myPackage.myActivity" 
      android:windowSoftInputMode="stateHidden"
        android:configChanges="keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.SHOW_PHONE_CALL_LIST" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
  </activity>

и поместите их в свой «myActivity»

public static Activity mApp=null; //Before onCreate()
  ...
onCreate( ... ) {
  ...
if (mApp == null) mApp = this; //Links your resources to other classes
  ...
    //Test if we've been called to show phone call list
    Intent _outcome = getIntent();
    String _phoneCallAction = mApp.getResources().getString(R.string.main_show_phone_call_list);
    String _reqAction = _outcome.getAction();//Can be null when no intent involved

         //Decide if we return to the Phone Call List view
         if (_reqAction != null &&_reqAction.equals(_phoneCallAction) == true) {
                         //DO something to return to look and feel
         }

  ...
        myListView.setOnItemClickListener(new OnItemClickListener() { //Act on item when selected
             @Override
             public void onItemClick(AdapterView<?> a, View v, int position, long id) {

                 myListView.moveToPosition(position);
                 String _bPartyNumber = "tel:"+myListView.getString(myListView.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

                 //Provide an initial state for the listener to access.
                 initialiseCallStatePreferences(_bPartyNumber);

                 //Setup the listener so we can restart myActivity
                    EndCallListener _callListener = new EndCallListener();
                    TelephonyManager _TM = (TelephonyManager)mApp.getSystemService(Context.TELEPHONY_SERVICE);

                    _TM.listen(_callListener, PhoneStateListener.LISTEN_CALL_STATE);

                         Intent _makeCall = new Intent(Intent.ACTION_CALL, Uri.parse(_bPartyNumber));

                 _makeCall.setComponent(new ComponentName("com.android.phone","com.android.phone.OutgoingCallBroadcaster"));
                    startActivity(_makeCall);                           
                finish();
              //Wait for call to enter the IDLE state and then we will be recalled by _callListener
              }
        });


}//end of onCreate()

, используйте это, чтобы инициализировать поведение вашего onClick в myActivity, например после onCreate ()

private void initialiseCallStatePreferences(String _BParty) {
    final int LAUNCHED = -1;
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
                                mApp.getBaseContext());
    SharedPreferences.Editor _ed = prefs.edit();

    String _prefKey = mApp.getString(R.string.last_phone_call_state_key),
           _bPartyKey = mApp.getString(R.string.last_phone_call_bparty_key);

    //Save default call state before next call
        _ed.putInt(_prefKey,LAUNCHED);
        _ed.putString(_bPartyKey,_BParty);
        _ed.commit();

}

Вы должны найти, что нажатие вашего списка телефонных номеров завершает вашу активность, делает звонок на номер и возвращается к вашей активности, когда вызов заканчивается.

Выполнение вызова извне вашего приложения в то время, когда оно все еще вокруг, не перезапустит вашу активность (если это не совпадает с последним номером BParty).

:)

13
ответ дан TheSolarSheriff 19 August 2018 в 07:08
поделиться
  • 1
    Извините, но этот код выглядит несколько уродливым. Спасибо за ответ, хотя – Pierre 9 January 2014 в 21:46

вы можете использовать startActivityForResult ()

7
ответ дан yakr 19 August 2018 в 07:08
поделиться
  • 1
    Я подтверждаю, что он работает! – Dmitri Novikov 25 May 2017 в 15:26
  • 2
    Используя android 5.0, метод onActivityResult вызывает вызов сразу же, как начинается звонок! – Panciz 8 June 2017 в 01:58
6
ответ дан 2 revs, 2 users 67% 30 October 2018 в 19:17
поделиться
24
ответ дан 2 revs, 2 users 80% 30 October 2018 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: