2

感觉这个问题已经被分配了,但没有一个适合我的需要,也没有一个解决方案适合我。

我有一个应用程序,其类扩展为 PhoneStateListener 以侦听以下状态:

  • CALL_STATE_RINGING(这里我用传入的电话号码设置了一个全局字符串变量)
  • CALL_STATE_OFFHOOK(在这里我想将我的任务/进程移到前面,以便用户在屏幕上看到我的应用程序以及呼叫者的详细信息,而不是在呼叫屏幕上)

我需要一种方法来最小化通话中屏幕(进入通知区域)我知道它可以完成(有证明)但我不知道如何做它被最小化后,我应该能够将我的任务移动到前面移动到后面。

我的应用程序启动,用户登录并按住后退按钮,用户保持登录状态,但应用程序被移至后台。如果有来电,我想查看我的应用程序中是否存在来电者电话号码(应用程序保留了几个用户信息),然后在最小化通话屏幕后转到用户信息。

当我在 CALL_STATE_OFFHOOK 状态下运行此代码时,调用被最小化并且地图全屏加载(证明)

public String IncomingTelephoneNumber;
private class CallStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                IncomingTelephoneNumber = incomingNumber;
                break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
                intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
                activity.startActivity(intent);
                break;
            }
        }
    }
}

获取地图源代码是不可能的。以同样的方式我想这样做,但是使用我自己的应用程序,我尝试了这个,但不起作用,调用屏幕仍然在应用程序前面(或者根本没有调用应用程序)。代码没有中断或任何东西,只是我的应用程序没有出现。

public String IncomingTelephoneNumber;
private class CallStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                IncomingTelephoneNumber = incomingNumber;
                break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {
                try {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_LAUNCHER);
                    intent.setFlags(270532608);//This is the flag which is used from the Launcher, LogCat helped here //flg=0x10200000
                    intent.setClassName(activity.getPackageName(), Splash.class.getCanonicalName());
                    activity.startActivity(intent);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }
}

我尝试了其他方法将应用程序带回前面,但不起作用。

我看到了这篇文章,但没有任何解决方案。

我使用的是 Android 版本 10,因为使用的设备需要它(Samsung P-1000 平板电脑,Android 2.3.3 是最新的官方版本)

任何帮助将非常感激。它可能是火车撞车或需要调用的非常简单的东西。但我希望这样做,就像地图一样。

编辑:我遇到了一个最小化通话中屏幕的解决方案(不是最好的解决方案,但它有效)

public String IncomingTelephoneNumber;
private class CallStateListener extends PhoneStateListener {

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING: {
                IncomingTelephoneNumber = incomingNumber;
                break;
            }
            case TelephonyManager.CALL_STATE_OFFHOOK: {
                try {
                    //This will simulate pressing the Home button
                    //Thus Minimizing the In Call Screen
                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    activity.startActivity(startMain);

                    //This is the part still not working Correctly
                    //Moving my Task/Process to the Front for the user to see
                    //This is Android 10, I still can not find a solution to move task to front
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_LAUNCHER);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setClassName(activity, Splash.class.getCanonicalName());
                    activity.startActivity(intent);
                } catch (Exception e) {
                    Log.v("", "e: " + e.getMessage());
                    e.printStackTrace();
                }
                break;
            }
        }
    }
}
4

1 回答 1

1

我找到了针对我的特定问题的解决方案,在尝试了各种不同的设置和阅读论坛之后,这就是我想出的并适用于Android GingerBread 2.3.3(版本 10)

为了最小化通话并转到主屏幕,我已经这样做了

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(startMain);

我决定不使用上述内容,只使用以下内容,它基本上完全符合我的需要(解决方案分为两部分,Intent 代码和 Android Manifest 文件中的代码)

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//Here the activity class in Question "JobDetail"
intent.setClassName(activity.getPackageName(), JobDetail.class.getCanonicalName());

//These extras I add and then use them in my
//JobDetail class to show the specific details for the caller
intent.putExtra("JobId", JobId);
intent.putExtra("FromCall", "true");
activity.startActivity(intent);

清单部分

<activity android:name="JobDetail" android:configChanges="orientation|keyboardHidden"
    android:taskAffinity="" android:launchMode="singleInstance"
    android:alwaysRetainTaskState="true" />

在 Manifest 文件中的特定 Activity 类下,您要放在前面,在我的例子中显示它在 上InCallScreen,添加以下三个属性/标签

  • android:taskAffinity=""(我不确定这是否有任何作用,但我把它留在那里)
  • android:launchMode="singleInstance"(我认为这将启动一个全新的 Activity 实例,但只有这个选项和上面的 Intent,我发现它重新启动了整个应用程序,因此添加了最后一个属性/标签)
  • android:alwaysRetainTaskState="true"(这确保它直接打开 Activity 类,而不是重置整个应用程序)

在此之后,处理您的后退键,以防您正在启动的活动类在另一个父活动中的应用程序的深处,依此类推。

还发现使用moveTaskToBack(true);最小化您的应用程序在 Gingerbread 中效果不佳。我不知道这背后的所有技术细节,但这告诉我有问题的应用程序被移到了堆栈的后面,因此发现将你的任务放在前面并不是一件容易的冒险。而是使用以下意图调用(模拟按下主页按钮,light-hide您的应用程序来自用户)。

@Override
public void onBackPressed() {
    //moveTaskToBack(true);
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
    //Show toast to notify the user that your application is still running in the background
    return;
}

我希望这可以帮助那些也遇到与我相同的问题的人使用旧硬件和旧软件。

于 2014-01-10T19:57:34.897 回答