如何检查数据连接是否打开,如果没有提示用户打开数据服务或退出应用程序android

How to check if data connection is on and if not prompt the user to turn on data services or exit app android

在大声说这是一个重复的问题之前,请注意我已经阅读了以下文章/问题: One; Two; Three; Four; Five; Six; Seven; Search Query

好的。现在,既然,希望我们确定我不是那么懒惰,只是愚蠢,我可以寻求你的帮助:如何检查数据连接是否打开,如果没有提示用户打开数据服务或退出应用程序 android ?! 请考虑到我是 Java/XML/Android 的新手,如果可能的话,我会要求您进行详尽的解释,因为到目前为止我尝试过的所有方法都不起作用(因为代码不完整,代码过时,糟糕的即兴创作和编程技巧(当然是我的)。 我也会满足于代码,但是如果有(一些)解释就更好了,因为这是我理解和学习的机会。

这是现在唯一的 "working" 实用程序(有点因为它总是说 "Error setting mobile data state",即使我在 运行 应用程序之前启用了数据):

public class WelcomeActivity extends AppCompatActivity {
ImageView imageView;

public void setMobileDataState(boolean mobileDataEnabled)
{
    try
    {
        TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);

        if (null != setMobileDataEnabledMethod)
        {
            setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
        }
    }
    catch (Exception ex)
    {
        //Log.e(TAG, "Error setting mobile data state", ex);
        Context context = getApplicationContext();
        Toast.makeText(context, "Error setting mobile data state", Toast.LENGTH_LONG).show();
    }
}

public boolean getMobileDataState()
{
    try
    {
        TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");

        if (null != getMobileDataEnabledMethod)
        {
            boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);

            return mobileDataEnabled;
        }
    }
    catch (Exception ex)
    {
       // Log.e(TAG, "Error getting mobile data state", ex);
        Context context = getApplicationContext();
        Toast.makeText(context, "Error getting mobile data state", Toast.LENGTH_LONG).show();
    }

    return false;
}



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome);
    imageView = (ImageView) findViewById(R.id.coverSpin);
    Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.welcome_animation);
    imageView.setAnimation(animation);

    getMobileDataState();
    setMobileDataState(true);
 ........................................

这是我应用程序的第一个Activity,它是一个"welcome"动画activity,我想检查数据是否打开,然后应用程序进一步正常运行,如果没有,给用户启用数据的可能性,如果,当(从设置中)用户 returns 禁用数据时,应用程序不会继续并退出 ...

感谢您的时间和理解(对于我的无技能和问题)。 感谢任何帮助!!!

我想对 vidulaJ 和 Jagadesha NH 说声谢谢。结合他们的两个解决方案,我成功地完成了任务。我发布了我使用的解决方案,以防万一其他人需要它。 vidulaJ 和 Jagadesha NH 再次感谢你们!

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;

import java.lang.reflect.Method;

public class WelcomeActivity extends AppCompatActivity {
private ImageView imageView;

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

    imageView = (ImageView) findViewById(R.id.coverSpin);
    Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.welcome_animation);
    imageView.setAnimation(animation);

    if(isMobileDataEnabled()){

        //Mobile data is enabled and do whatever you want here
        Toast.makeText(this, getString(R.string.sDataOKEnable), Toast.LENGTH_SHORT).show();

}


    else{
        //Mobile data is disabled here
        new AlertDialog.Builder(this).setTitle(getString(R.string.sDataReqMes))
                .setMessage(getString(R.string.sDataReqEnable)).setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // if user clicks ok then it will open network settings
                startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
            }
        }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        }).show();
    }}


private boolean isMobileDataEnabled(){
    boolean mobileDataEnabled = false;
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        method.setAccessible(true);

        mobileDataEnabled = (Boolean)method.invoke(cm);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mobileDataEnabled;
}

}

我仍然可以使用一些帮助直接打开数据 enable/disable activity/menu 而不是常规设置 activity ...

试试这个。

import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

import java.lang.reflect.Method;

public class WelcomeActivity extends AppCompatActivity{

    private ImageView imageView;

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

        imageView = (ImageView) findViewById(R.id.coverSpin);
        Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.welcome_animation);
        imageView.setAnimation(animation);

        if(isMobileDataEnabled()){
            //Mobile data is enabled and do whatever you want here
        }
        else{
            //Mobile data is disabled here
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Error");
            builder.setMessage("No mobile data connection detected.");
            builder.setCancelable(false);

            builder.setPositiveButton("Exit", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    finish();
                }
            });
            AlertDialog alert = builder.create();
            alert.show();               
        }
    }

    private boolean isMobileDataEnabled(){
        boolean mobileDataEnabled = false;
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            Class cmClass = Class.forName(cm.getClass().getName());
            Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
            method.setAccessible(true);

            mobileDataEnabled = (Boolean)method.invoke(cm);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mobileDataEnabled;
    }

}

请试试这个

public boolean isNetworkAvailable(Context context) {
        ConnectivityManager ConnectMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (ConnectMgr == null)
            return false;
        NetworkInfo NetInfo = ConnectMgr.getActiveNetworkInfo();
        if (NetInfo == null)
            return false;

        if (!NetInfo.isConnected()) {
            //Show pop up
        }
    }

不要忘记在清单中添加这些权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

试试这个简单的程序,如果数据不在它会提醒用户打开设置

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!isDataAvailable()) { //check if data is enabled or not
            new AlertDialog.Builder(this).setTitle("Unable to connect")
                    .setMessage("Enable data?").setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // if user clicks ok then it will open network settings
                    startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                }
            }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            }).show();
        } else {
            Toast.makeText(this, "DATA IS ON", Toast.LENGTH_SHORT).show();
        }
    }

    private boolean isDataAvailable() {
        // returns true or false based on whether data is enabled or not
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnected();
    }
}