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

在Android Studio上显示带有重定向的互联网连接对话框

公冶谦
2023-03-14

*不是重复的资源,我已经访问了所有可用的答案。

我正在尝试构建一个Android Studio应用程序。

我如何强制应用程序在没有连接时显示对话框,然后在有移动或wifi连接时将用户重定向到活动。

用户必须在打开Internet连接之前才能退出对话框。

当数据打开时,对话框应自动消失。

我已经尝试了我在Stackoverflow上看到的所有代码,但我使用的所有代码都不起作用,有些代码会导致应用程序崩溃。

在API 30中实现此结果的最简单方法是什么?

共有2个答案

鲁单弓
2023-03-14

您可以创建一个广播接收器并在您的主要活动中注册它。每当设备与互联网的连接发生变化时,接收器都会收到通知。

1、在布局中创建自定义对话框dialog.xml。例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">

    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/light_purple"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:textSize="18sp"
        android:text="You're not connected!" />
</LinearLayout>

2、创建静态方法检查连接状态:

public static boolean checkConnection(Context context)
{
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnected();
        return isConnected;
}

3. 创建一个从广播接收器扩展的新类:

public class OfflineBroadcastReceiver extends BroadcastReceiver 
{
    public OfflineBroadcastReceiver() {}

    @Override
    public void onReceive(final Context context, final Intent intent)
    {
        // No connection
        if(!checkConnection(context))
        {
            // Activity with dialog
            Intent offline = new Intent(context, Activity.class);
            context.startActivity(offline);
        }
        // Connected
        else
        {
            Intent offline = new Intent(context, OfflineActivity.class);
            context.startActivity(offline);
        }
    }
}

4. 在 onCreate 中启动的活动(默认情况下为 MainActivity)中创建接收器,向筛选器添加CONNECTIVITY_ACTION操作,然后注册它:

    OfflineBroadcastReceiver offlineForeground = new OfflineBroadcastReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(offlineForeground, filter);
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

注意:当应用程序未运行时,不会在后台通知接收者。您可以创建一个Manifest声明的接收方来执行此操作。

在GitHub:https://github.com/shahar0809/OfflineReceiver

骆照
2023-03-14

步骤1:将此Typealias添加到导入文件下面或类上面

typealias OnRetryInternetConnection = () -> Unit

步骤2:添加此代码(自定义警报对话框)

fun internetValidationDialog(
                activity: Activity,
                onRetryInternetConnection: OnRetryInternetConnection
        ) {

            try{
                val mDialogView = LayoutInflater.from(activity).inflate(R.layout.your_custom_layout_with_retry_button, null)
                val mBuilder = AlertDialog.Builder(activity)
                        .setView(mDialogView)
                val mAlertDialog = mBuilder.show()
                mAlertDialog.setCancelable(false)
                mDialogView.llRetry.setOnClickListener {
                    run {
                        onRetryInternetConnection.invoke()
                    }
                    mAlertDialog.dismiss()
                }
            }catch (e: Exception){
                e.printStackTrace()
            }

        }

步骤3:此功能将用于检查互联网连接

fun isNetworkConnected(): Boolean {
            var result = false
            val cm = application!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
            cm?.run {
                cm.getNetworkCapabilities(cm.activeNetwork)?.run {
                    result = when {
                        hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                        hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                        hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                        else -> false
                    }
                }
            }
            return result
        }

步骤 4:将此代码添加到要验证互联网连接的位置

如果未连接互联网,它将显示警报对话框,如果您再次单击重试按钮,则调用此方法并重复,直到满足条件。

fun callYourNextLogin() {
            button.setOnClickListener {
                when {
                    isNetworkConnected() -> {
                        // Go ahead internet is connected
                    }
                    else -> {
                        internetValidationDialog(requireActivity()) {
                            callYourNextLogin()
                        }
                    }
                }
            }
        }

步骤5:要自动关闭互联网连接,只需使用Live数据进行观察。

 类似资料:
  • 若要使用PS Vita与互联网连接,需先准备无线通信的环境。 若您的住家等地无法通过无线通信,可使用公众无线LAN服务(Hotspot)在公众场所与互联网连接。 公众无线LAN服务的使用方法与费用会因该服务的提供者而异。详细请询问该服务的提供者。 使用Wi-Fi连接 若要使用Wi-Fi与互联网连接,需准备以下内容。此外,接入点的设定通常会通过电脑进行。 与网络服务商签订合约 接入点或无线路由器 接

  • 可确认目前连接的接入点信息或网络的连接状态。

  • 进行与互联网间的连接测试,并显示结果。 名称* 目前使用的互联网连接之连接名称 SSID* 接入点的SSID 获取IP地址 显示是否可获取IP地址 互联网连接 显示是否可与互联网连接 登陆PlayStation®Network 显示是否能登陆PlayStation®Network NAT类型 显示PS Vita与互联网的连接方式 使用游戏的通信功能等时,可确认与其它PS Vita间的连接稳定性。

  • 我正在制作一个使用语音识别的应用程序。它与Android KitKat 4.4.4(API 19)完美配合。但是当我在Nouget 7.0(API 24)或Lollipop语音识别对话框上尝试时,会显示网络未连接。 我有internet连接,并且在清单中添加了权限。可能是什么问题? 这是我的清单: 根据要求,我的主要活动:

  • 我知道以前有人问过这个问题,但那篇文章中的解决方案对我不起作用。 我刚刚开始学习Android编程,当时正在做一个模型。它可以在Android Studio中正确显示,但不能在我的设备上显示。图像和背景色显示正确,但没有文本显示。我试过改变字体和字体颜色。需要改变什么? 我有另一个使用RelativeLayout的示例,它显示正确,但这个ConstraintLayout不正确。 第一个图像来自AS

  • 我有一个SpringBoot应用程序,它实现了一个Websocket服务器(SockJS)。 我可以在本地网络上将客户端连接到该服务器,只要托管该应用程序的Ubuntu机器可以访问互联网。 2016-10-27 11:22:20.802调试9390---[nio-8085-exec-9]o.a.coyote.http11.org.apache.tomcat.util.net.NioEndpoint