当前位置: 首页 > 知识库问答 >
问题:

如何在Android 10中打开活动(传入voip呼叫)

殳阳飙
2023-03-14

在Android 10中,应用程序有了新的限制。我们不能再从后台开始活动。虽然这对大多数应用程序来说可能没问题,但对于需要在消息推送到达后显示进线量的voip应用程序来说,这是一个致命的打击。

根据这个https://developer . Android . com/guide/components/activities/background-starts,有一个可以满足的条件列表,仍然允许打开一个活动,但是tbh我不完全理解(此处非英语母语)。

我绝对知道的是:

>

  • 我没有任何跑步活动、任务、后台等

    该应用程序甚至没有运行

    我需要实现的目标:

    • 该应用程序的FCM服务接收来自我们服务器的推送,并应显示来电屏幕(通过锁定屏幕和所有 - 就像Android 9及更低版本一样)

    在android 10中为一个来电的网络电话开通一个活动可以做什么?就像普通用户对手机应用程序的期望一样。

    提前感谢任何提示。

  • 共有3个答案

    卢嘉誉
    2023-03-14

    请浏览我的博客,了解如何打开OS 10的活动,以及如何显示平视通知和处理操作按钮上的点击。

    https://medium.com/@dcostalloyd90/show-incoming-voip-call-notification-and-open-activity-for-android-os-10-5aada2d4c1e4

    金毅
    2023-03-14

    使用具有“全屏意图”的高优先级通知。这将:

    • 如果设备被锁定,调用您的“全屏意图”
    • 否则,显示“抬头”通知
    邓丰
    2023-03-14

    在锁定屏幕上打开活动。您可以使用具有“全屏意图”的高通知作为共享资源软件的答案。但要了解更多细节,您可以尝试我的解决方案,如下面的代码:

    >

  • 创建一个前台服务,然后在onStartCommand方法中调用buildNotification,buildNotification方法将返回一个放入startForeground方法参数中的通知。

     public class IncomingCallService extends Service {
         public int onStartCommand(Intent intent, int flags, int startId) {
             Notification notification = buildNotification();
             startForeground(1, notification);
             return START_NOT_STICKY;
         }
     }
    

    在buildNotify方法中,我们将创建具有高优先级、调用类别和全屏意图的通知。

     private Notification buildNotification() {
         Intent fullScreenIntent = new Intent(this, IncomingCallActivity.class);
         PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
         NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
         NotificationCompat.Builder notificationBuilder =
             new NotificationCompat.Builder(this)
                     .setSmallIcon(R.drawable.ic_notification_icon)
                     .setContentTitle("Incoming call")
                     .setContentText("(919) 555-1234")
                     .setPriority(NotificationCompat.PRIORITY_HIGH)
                     .setCategory(NotificationCompat.CATEGORY_CALL)
                     // Use a full-screen intent only for the highest-priority alerts where you
                     // have an associated activity that you would like to launch after the user
                     // interacts with the notification. Also, if your app targets Android 10
                     // or higher, you need to request the USE_FULL_SCREEN_INTENT permission in
                     // order for the platform to invoke this notification.
                     .setFullScreenIntent(fullScreenPendingIntent, true);
         notificationBuilder.setAutoCancel(true);
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             notificationManager.createNotificationChannel(new NotificationChannel("123", "123", NotificationManager.IMPORTANCE_HIGH));
             notificationBuilder.setChannelId("123");
         }
         Notification incomingCallNotification = notificationBuilder.build();
         return incomingCallNotification;
     }
    

    在onStartCommand中,添加一行代码以发送ACTION_CLOSE_SYSTEM_DIALOGS广播操作。这验证了启动全屏待定意图的重要性。

     public int onStartCommand(Intent intent, int flags, int startId) {
         Notification notification = buildNotification();
         startForeground(1, notification);
         sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
         return START_NOT_STICKY;
     }
    

    创建要在锁定屏幕上显示的全屏活动,然后您需要添加setShowWhenLocked和setTurnScreenOn以在锁定屏幕上显示。如果没有,您的活动将显示在锁定屏幕后面。下面是我的示例。

     public class IncomingCallActivity extends AppCompatActivity {
         protected void onCreate(@Nullable Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_explore);
             setShowWhenLocked(true);
             setTurnScreenOn(true);
             getWindow().addFlags(
             WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                     | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                     | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                     | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
         }
     }
    

    现在,当您收到来自逻辑的呼叫时,必须启动IncomingCallService。

     public void startCallService() {
         Intent intent = new Intent(context, IncomingCallService.class);
         startForegroundService(intent);
     }
    

    您必须在清单中声明活动、服务和某些权限,如下所示:

     <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <application
        ...>
         <activity android:name=".IncomingCallActivity" />
         <service
             android:name=".IncomingCallService"
             android:enabled="true"
             android:exported="true" />
     </application>
    

    我在谷歌,三星,vsmart手机上进行了测试。它工作得很好。但对于可可美设备。您需要通过以下步骤的流程启用一些权限:

    1. 长按您的应用程序图标
    2. 打开应用程序信息
    3. 单击“其他权限”项
    4. 允许在锁定屏幕上显示

    现在,您的应用程序将在xaomi设备上运行。如果你对我的解决方案有任何问题,请在这里留言。如果可以的话,我会帮你的。

  •  类似资料:
    • 问题内容: 在Android 10中,对应用程序应用了新的限制。我们不能再从后台开始活动了。尽管这对于大多数应用程序来说可能很好,但这对于需要在推送通知到达后显示来电的voip应用程序是致命的打击。 根据此https://developer.android.com/guide/components/activities/background- starts, 存在可以满足的条件列表,但仍然允许打开

    • 能否有人,请帮助我或指出我在正确的方向,如何触发一个来电在应用程序,当一个VoIP通知收到。 下面是我在viewcontroller.swift文件中的代码

    • 我想实现一个功能在VoIP呼叫使用Twilio。例如,如果有人打电话给客户服务号码,在这种情况下,他们必须拨一些号码来导航,比如拨一些号码,选择语言,拨一些号码来与代表交谈。 注意:我可以在这里获得活动连接。浏览之后,我发现需要在TWIML中提供关键字。但在这种情况下我需要通过这些吗?我认为在我描述的情况下不需要它。 我走对路了吗?这有可能实现吗?如果我错过了什么?

    • 是否可以在Android中以编程方式打开上面的页面?

    • 我试图在Android Studio中创建一个Android应用程序,它与谷歌地图API一起工作。我已经成功地将标记添加到地图上我选择的某个LatLng位置。 单击标记时,它会弹出一个名为“测试”的标题。但我想要的是,当用户点击标记标题时,它必须打开一个新的活动。然而,我似乎无法让它发挥作用。我已经添加了一个onMarkerClick,但是,我无法实现它。我真的很困惑。我尝试添加回调方法,但不确定

    • 问题内容: 我已经在voip应用程序中实现了呼叫工具包,在该工具包中,我为传入或传出的呼叫生成了呼叫日志(在“电话最近使用”标签上可见)。当我单击通话记录时,它将打开我的应用程序。我已经重写了委托方法来获取处理程序。 但是我无法获得有关呼叫日志的信息。如何在我的应用程序中获取通话记录信息? 任何帮助,不胜感激。谢谢! 问题答案: 我们可以从 userActivity* 获取 电话号码 , *