2009-03-01 14 views
42

私は必要なことの1つが、少なくとも私たちのアプリケーションからそれを止めることができるように、発信を制御することですアプリケーションを開発しています。Androidで電話を切る方法は?

私は、既存のアクティビティからIntent.ACTION_CALLを使用して試してみた:

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 
startActivity(callIntent); 

しかし、呼び出しを停止するAPIを介して不許可にしているようです。

いくつかの回避策を提案できますか?

たとえば、通話中に飛行機モードを有効にしますか?ほんの一例。このハックは私のためには機能しませんでした。

+0

を使用しませんでした'BroadcastReceiver'はあなたのために働くのですか?この質問を修正したり、答えを受け入れることができますか? –

+0

コールを終了することができます。 AndroidマーケットのTextMe4Callbackはこれを行います。 –

答えて

3

素晴らしいいたずらの可能性を考えれば、これが許されれば驚くだろう。

このスレッドは平易にそのthe API cannot end a callを示しています。その他have tried

+3

[tCallBlocking Lite](http://www.taosoftware.co.jp/jp/android/callblockinglite/)でどうやってやったのですか? – an0

+1

もちろん可能です。上記の答えを見てください。 –

21
  1. 同じ方法でそのonReceive方法
  2. コールsetResultData(null)

このからコールを防止するにACTION_NEW_OUTGOING_CALL意図インターセプトBCは0

  • の優先順位とBroadcastReceiverを作成あなたのレシーバーが私が思った意図を最後に処理する限り、開始します。

  • +2

    これはAndroid 2.1と2.2で動作することを確認できます。 –

    +0

    私はまた、この方法を使用します。 – Nissan911

    +0

    Android 2.3.3以前では動作するが、Android 4.0以降では動作しない理由についてのご意見はありますか?私はBroadcastReceiverでACTION_NEW_OUTGOING_CALLを受け取ることができません。私は電話を取り消す部分には興味がありません。ちょうど私が働くことができないコールについて知っています。どんな考えもありがとう、ありがとう! – DonnaLea

    5

    sabling機内モード:

    EXTRA_PHONE_NUMBER - もともとダイヤルされることを意図電話番号:

    android.provider.Settings.System.putInt(getContentResolver(), 
         android.provider.Settings.System.AIRPLANE_MODE_ON, 1); 
    
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
    intent.putExtra("state", 1); 
    sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
    sendBroadcast(intent); 
    android.provider.Settings.System.putInt(getContentResolver(), 
         android.provider.Settings.System.AIRPLANE_MODE_ON, 0); 
    
    intent.putExtra("state", 0); 
    sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
    sendBroadcast(intent); 
    
    +11

    スレッジハンマー、適合ナット。 –

    +3

    現在、発信コールを切断する方法はありません。Gung Shi Jieによって提案されたソリューションは良いアイデアですが、機能しません。「AIRPLANE MODE」状態は発信コール中に無視されます。開発中にemulaterd端末でのみ動作し、HTC DesireとAcer Liquidの両方で試してみました。 –

    0

    ACTION_NEW_OUTGOING_CALL

    上の文書によると、テントは、以下の付加価値を持つことになります。

    ブロードキャストが終了すると、resultDataが実際の呼び出し番号として使用されます。 nullの場合、呼び出しは行われません。 Ilanaのために

    +1

    これは 'setResultData(null)'を使う[灰の答え](http://stackoverflow.com/questions/599443/android-how-to-hang-up-outgoing-call/637284#637284)の説明です。 。 –

    4

    :すべてです

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

    public class ilanasReceiver extends BroadcastReceiver { 
        public void onReceive(Context context, Intent intent) { 
         if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
          if (getResultData()!=null) { 
           String number = "123456"; 
           setResultData(number); 
          } 
         } 
        } 
    } 
    

    マニフェストに加えて、パッケージのセクションを中に入れました。

    29

    BroadcastReceiverで発信コールをキャプチャする方法が記載されており、ダイヤルする前にコールを終了する場合は、これを実行する最善の方法です。

    しかし、ダイヤルやインコールでは、そのテクニックはもう機能しません。これまでに遭遇したハングアップの唯一の方法は、Java Reflectionを使用することです。パブリックAPIの一部ではないため、を使用するように注意してください。には依存しません。Androidの内部構成を変更すると、アプリケーションが効果的に中断されます。

    Prasanta Paul's blog demonstrates私は以下に要約しました。これを試してみてください

    telephonyService.endCall(); 
    
    +6

    +1良いことはしませんが、OPはAPIによって許可されていないものの回避策を具体的に求めているので、これは良い答えです。 –

    +1

    これが唯一の解決策であれば、これは素晴らしい答えだと思います! – TacB0sS

    +0

    私はこのコードでparticlarコールをブロックできません –

    25

    :通話を終了

    TelephonyManager tm = (TelephonyManager) context 
         .getSystemService(Context.TELEPHONY_SERVICE); 
    try { 
        // Java reflection to gain access to TelephonyManager's 
        // ITelephony getter 
        Log.v(TAG, "Get getTeleService..."); 
        Class c = Class.forName(tm.getClass().getName()); 
        Method m = c.getDeclaredMethod("getITelephony"); 
        m.setAccessible(true); 
        com.android.internal.telephony.ITelephony telephonyService = 
          (ITelephony) m.invoke(tm); 
    } catch (Exception e) { 
        e.printStackTrace(); 
        Log.e(TAG, 
          "FATAL ERROR: could not connect to telephony subsystem"); 
        Log.e(TAG, "Exception object: " + e); 
    } 
    

    ITelephonyオブジェクトを取得

    (私はReflection to access advanced telephony featuresを使用し、代を変更)

    // required permission <uses-permission android:name="android.permission.CALL_PHONE"/> 
    
    try { 
        //String serviceManagerName = "android.os.IServiceManager"; 
        String serviceManagerName = "android.os.ServiceManager"; 
        String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
        String telephonyName = "com.android.internal.telephony.ITelephony"; 
    
        Class telephonyClass; 
        Class telephonyStubClass; 
        Class serviceManagerClass; 
        Class serviceManagerStubClass; 
        Class serviceManagerNativeClass; 
        Class serviceManagerNativeStubClass; 
    
        Method telephonyCall; 
        Method telephonyEndCall; 
        Method telephonyAnswerCall; 
        Method getDefault; 
    
        Method[] temps; 
        Constructor[] serviceManagerConstructor; 
    
        // Method getService; 
        Object telephonyObject; 
        Object serviceManagerObject; 
    
        telephonyClass = Class.forName(telephonyName); 
        telephonyStubClass = telephonyClass.getClasses()[0]; 
        serviceManagerClass = Class.forName(serviceManagerName); 
        serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
    
        Method getService = // getDefaults[29]; 
        serviceManagerClass.getMethod("getService", String.class); 
    
        Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
           "asInterface", IBinder.class); 
    
        Binder tmpBinder = new Binder(); 
        tmpBinder.attachInterface(null, "fake"); 
    
        serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
        IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
        Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 
    
        telephonyObject = serviceMethod.invoke(null, retbinder); 
        //telephonyCall = telephonyClass.getMethod("call", String.class); 
        telephonyEndCall = telephonyClass.getMethod("endCall"); 
        //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall"); 
    
        telephonyEndCall.invoke(telephonyObject); 
    
    } catch (Exception e) { 
        e.printStackTrace(); 
        Log.error(DialerActivity.this, 
           "FATAL ERROR: could not connect to telephony subsystem"); 
        Log.error(DialerActivity.this, "Exception object: " + e); 
    } 
    
    +1

    それはアプリケーションをスローする電話をハングアップするだけでうまく動作してくれてありがとう – shereifhawary

    +3

    優れています。 [必要なアクセス許可 ""] –

    +0

    は本当にうまく動作します。スピーカーを有効にする、答えを...するなど、他の有益なコールアクションを知っていますか? –

    関連する問題