Can I hang up a call programmatically in android?

前端 未结 4 1670
慢半拍i
慢半拍i 2020-12-04 09:00

I hope to block some crank call, so I need to hang up some call programmatically in android.

The following fragment is from How to hang up outgoing call in Android?<

相关标签:
4条回答
  • 2020-12-04 09:28

    Does it mean the technique of hang up call will be block at any time in further Android version?

    There's a possibility that Android Team would turn everything upside down for this concrete service. As for me, I think such possibility is pretty negligible.

    Does it mean I can't write an app to hang up a call?

    If the proposed approach works, why not? Just do it, keeping in mind (somewhere in background of your mind, yeah :)) that somewhere in the distant future something could get complicated, and you'll have to look for another dirty hack breaking through the rustless API, which does not allow you to hang a call.

    0 讨论(0)
  • 2020-12-04 09:28

    If you are in JUnit test then this is how;

    mInstrumentation = InstrumentationRegistry.getInstrumentation();
    mInstrumentation.getUiAutomation().executeShellCommand( "input keyevent " + KeyEvent.KEYCODE_ENDCALL );
    

    It may work also from outside the test but I haven't tried it.

    0 讨论(0)
  • 2020-12-04 09:30

    This is completely without testing but couldn't you just turn airplane mode off and on when a call that matches your blacklist appears?

    Other than that, this seemed to work in pre kitkat http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html

    0 讨论(0)
  • 2020-12-04 09:32

    First, you need to declare this permission in AndroidManifest.xml

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

    Then you setup a BroadcastReceiver service for android.intent.action.PHONE_STATE (incoming calls) and android.intent.action.NEW_OUTGOING_CALL (outgoing calls) by adding the following to AndroidManifest.xml

    AndroidManifest.xml

    <receiver android:name=".PhoneStateReceiver">
        <intent-filter android:priority="0">
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>
    

    PhoneStateReceiver.JAVA

    import java.lang.reflect.Method;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    public class PhoneStateReceiver extends BroadcastReceiver {
    
        public static String TAG="PhoneStateReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("android.intent.action.PHONE_STATE")) { 
                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                Log.d(TAG,"PhoneStateReceiver**Call State=" + state);
    
                if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                    Log.d(TAG,"PhoneStateReceiver**Idle");
                } else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
                    // Incoming call
                    String incomingNumber = 
                            intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.d(TAG,"PhoneStateReceiver**Incoming call " + incomingNumber);
    
                    if (!killCall(context)) { // Using the method defined earlier
                        Log.d(TAG,"PhoneStateReceiver **Unable to kill incoming call");
                    }
    
                } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                    Log.d(TAG,"PhoneStateReceiver **Offhook");
                }
            } else if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { 
                // Outgoing call
                String outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                Log.d(TAG,"PhoneStateReceiver **Outgoing call " + outgoingNumber);
    
                setResultData(null); // Kills the outgoing call
    
            } else {
                Log.d(TAG,"PhoneStateReceiver **unexpected intent.action=" + intent.getAction());
            }
        }
    
        public boolean killCall(Context context) {
            try {
                // Get the boring old TelephonyManager
                TelephonyManager telephonyManager =
                        (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    
                // Get the getITelephony() method
                Class classTelephony = Class.forName(telephonyManager.getClass().getName());
                Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony");
    
                // Ignore that the method is supposed to be private
                methodGetITelephony.setAccessible(true);
    
                // Invoke getITelephony() to get the ITelephony interface
                Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);
    
                // Get the endCall method from ITelephony
                Class telephonyInterfaceClass =  
                        Class.forName(telephonyInterface.getClass().getName());
                Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");
    
                // Invoke endCall()
                methodEndCall.invoke(telephonyInterface);
    
            } catch (Exception ex) { // Many things can go wrong with reflection calls
                Log.d(TAG,"PhoneStateReceiver **" + ex.toString());
                return false;
            }
            return true;
        }
    
    }
    

    MainActivity.JAVA

    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
    public static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 101;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
    
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_PHONE_STATE)) {
    
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
    
            } else {
    
                // No explanation needed, we can request the permission.
    
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_PHONE_STATE},
                        MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    
                // MY_PERMISSIONS_REQUEST_READ_PHONE_STATE is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay!
    
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    }
    
    0 讨论(0)
提交回复
热议问题