電話をかけるアクティビティを開始していますが、「通話終了」ボタンを押しても、アクティビティに戻りません。 「通話終了」ボタンが押されたときに戻る通話アクティビティを起動する方法を教えてください。これは私が電話をかける方法です:
String url = "tel:3334444";
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
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"/>
これは、スターターからの質問に関するものです。
コードの問題は、番号を正しく渡していないことです。
コードは次のとおりです。
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
が使用される場合の緊急番号用。
同じ問題があり、PhoneStateListener
を使用して呼び出しがいつ終了するかを特定することで解決できましたが、さらに、startActivity
で再度開始する前に元のアクティビティをfinish()
する必要がありました。
説明した動作(finish()、call、restart)を取得するために、EndCallListenerが最も機能的な例であることがわかりました。
私のOnClick、initialize、および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()
これを使用して、myActivityのonClickの動作を初期化します。 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番号と同じでない限り)アクティビティが再開されません。
:)
startActivityForResult()を使用できます
これは私の観点からの解決策です:
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);
}
もちろん、アクティビティ(クラス)定義ではView.OnClickListenerを実装する必要があります。
@Override
public void onClick(View view) {
Intent phoneIntent = new Intent(Intent.ACTION_CALL);
phoneIntent.setData(Uri.parse("tel:91-000-000-0000"));
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
startActivity(phoneIntent);
}
ここに私の例があります。最初に、ユーザーはダイヤルしたい番号を書き、次に呼び出しボタンを押して電話に転送されます。コールのキャンセル後、ユーザーはアプリケーションに送り返されます。これを行うには、ボタンのxmlにonClickメソッド(この例では「makePhoneCall」)が必要です。また、許可をマニフェストに登録する必要があります。
マニフェスト
<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" />
リスナーを使用する場合は、この許可をマニフェストにも追加する必要があります。
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
呼び出しが終了した後のPhoneStateListenerの内部での使用が適切です:
Intent intent = new Intent(CallDispatcherActivity.this, CallDispatcherActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
CallDispatcherActivityは、ユーザーが(私の場合はタクシーサービスディスパッチャーへの)呼び出しを開始したアクティビティです。これにより、Androidテレフォニーアプリが上部から削除されるだけで、ユーザーはここで見たいコードの代わりに戻ってきます。
完璧なチュートリアル こちら !このブログには多くの優れたチュートリアルがあるため、常にチェックしてください!
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" />
Activity
に戻るには、TelephonyStates
をリッスンする必要があります。そのlistener
で、Intent
を送信して、電話がアイドル状態になったらActivity
を再度開くことができます。
少なくともそれは私がそれをする方法です。
// 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>
使用してみてください:
finish();
アクティビティの終わりに。以前のアクティビティにリダイレクトされます。
PhoneStateListener
を使用する場合は、PHONE_STATE_IDLE
に続くPHONE_STATE_OFFHOOK
を使用して、呼び出し後に実行されるアクションをトリガーする必要があります。 PHONE_STATE_IDLE
を見たときにトリガーが発生した場合、呼び出しの前にトリガーを実行することになります。状態の変更が表示されるのでPHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.
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
@Dmitri Novikov、FLAG_ACTIVITY_CLEAR_TOP
は、新しいインスタンスの上にあるアクティブなインスタンスをすべてクリアします。そのため、プロセスを完了する前に古いインスタンスを終了する場合があります。
これはあなたのxmlに追加してください:Android:autoLink="phone"
手順:
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
に置き換えます
これを参照してください 回答
通話を開始するとき、それはうまく見えます。
ただし、アプリを前面に表示する場合は、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" />
立ち往生するかどうか、またはいつ質問するか質問してください。