【问题标题】:Hang up and decline incoming call by custom activity[buttons] Android通过自定义活动挂断和拒绝来电[按钮] Android
【发布时间】:2014-03-04 21:32:06
【问题描述】:

我刚刚学习了一点Android,我偶然发现了这个问题。

我想做一个“自定义来电屏幕”。我当前的解决方案是从 BroadcastReceiver 扩展的类(IncomingCallInterceptor)。在 IncomingCallInterceptor 类中,我覆盖 onReceive 并在电话响铃时使用布局启动我的活动(MainActivity)。

在那个活动(MainActivity)中,我有三个按钮: 接听电话、挂断电话、拒绝电话

这些按钮应该按照他们说的去做,接听电话、挂断电话或拒绝来电。

我以某种方式让接受呼叫工作,但没有挂断和拒绝。

下面是我的代码:

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.uppgift.six.one.incoming61.sixone" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <receiver android:name="IncomingCallInterceptor">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
        </receiver>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
        </activity>
    </application>
</manifest>

从 BroadcastReceiver 扩展的 IncomingCallInterceptor:

public class IncomingCallInterceptor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Context appContext = context.getApplicationContext();
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String msg = "Phone state changed to " + state;

        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
            String incomingNumber = intent.getStringExtra
                    (TelephonyManager.EXTRA_INCOMING_NUMBER);
            msg += ". Incoming number is this " + incomingNumber;

            //START MY ACTIVITY!
            Intent i = new Intent(appContext, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            appContext.startActivity(i);
        }
        Toast.makeText(context, msg, Toast.LENGTH_LONG).show();

    }

}

这是我的Activity(布局没什么好贴的,刚才基本是三个按钮)

public class MainActivity extends ActionBarActivity {

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

        Button btnAnswer = (Button)findViewById(R.id.btnAnswer);
        Button btnDecline= (Button)findViewById(R.id.btnDecline);
        Button btnHangUp= (Button)findViewById(R.id.btnHangUp);

        btnAnswer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
                i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,
                        KeyEvent.KEYCODE_HEADSETHOOK));
                sendOrderedBroadcast(i, null);
            }
        });

        btnDecline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Decline Call (I need help here)
            }
        });

        btnHangUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Hang Up Call (I need help here)
            }
        });
    }

在 MainActivity 类中,它由 cmets 标记,我需要一些帮助。 我还看到了有关“电话服务接口”(thingy)解决方案的一些信息,但我在测试它时不明白它是如何工作的。

【问题讨论】:

    标签: java android broadcastreceiver


    【解决方案1】:

    拒接电话:

     try {
    
                    TelephonyManager tm = (TelephonyManager)
                            getSystemService(Context.TELEPHONY_SERVICE);
                    try {
                        Class c = Class.forName(tm.getClass().getName());
                        Method m = c.getDeclaredMethod("getITelephony");
                        m.setAccessible(true);
                        Object telephonyService = m.invoke(tm); // Get the internal ITelephony object
                        c = Class.forName(telephonyService.getClass().getName()); // Get its class
                        m = c.getDeclaredMethod("endCall"); // Get the "endCall()" method
                        m.setAccessible(true); // Make it accessible
                        m.invoke(telephonyService); // invoke endCall()
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
    
                } catch (Exception e) {
    
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多