Android:isProviderEnabled(LocationManager.NETWORK_PROVIDER) 不起作用。只有 isProviderEnabled(LocationManage

Posted

技术标签:

【中文标题】Android:isProviderEnabled(LocationManager.NETWORK_PROVIDER) 不起作用。只有 isProviderEnabled(LocationManager.GPS_PROVIDER)【英文标题】:Android:isProviderEnabled(LocationManager.NETWORK_PROVIDER) doesn't work.Only isProviderEnabled(LocationManager.GPS_PROVIDER) 【发布时间】:2019-01-04 22:42:31 【问题描述】:

当我在手机上运行我的应用程序时,我可以看到只有 GPS_PROVIDER 工作正常。NETWORK_PROVIDER 仅在 GPS_PROVIDER 被触发时才会触发。 这是代码

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

    final LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (!lm.isProviderEnabled(locationProvider)) 
        networkCheck();
    

    // Get Location Manager and check for GPS & Network location services
    if (!lm.isProviderEnabled(gpsProvider)) 
        gpsCheck();

    


 private void networkCheck() 
    Toast.makeText(MainActivity.this, "NETWORK!!!!", Toast.LENGTH_SHORT);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    View mView = getLayoutInflater().inflate(R.layout.activity_internet_access_alert_dialog, null);
    Button positiveBtn = (Button) mView.findViewById(R.id.positiveNetworkBtn);
    final Button negativeBtn = (Button) mView.findViewById(R.id.negativeNetworkBtn);
    builder.setView(mView);
    final AlertDialog networkDialog = builder.create();
    positiveBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            networkDialog.dismiss();

        
    );

    negativeBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            finish();
            System.exit(0);
        
    );
    networkDialog.setCancelable(false);
    networkDialog.setCanceledOnTouchOutside(false);
    networkDialog.show();


public void gpsCheck()

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    View mView = getLayoutInflater().inflate(R.layout.activity_gps_alert_dialog, null);
    Button positiveBtn = (Button) mView.findViewById(R.id.positiveBtn);
    final Button negativeBtn = (Button) mView.findViewById(R.id.negativeBtn);
    builder.setView(mView);
    final AlertDialog dialog = builder.create();
    positiveBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            // Show location settings when the user acknowledges the alert dialog
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
            dialog.dismiss();

        
    );

    negativeBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            finish();
            System.exit(0);
        
    );
    dialog.setCancelable(false);
    dialog.setCanceledOnTouchOutside(false);
    dialog.show();



我注意到如果我的手机上启用了位置(GPS_ENABLED)并且也启用了网络数据,则 NETWORK_PROVIDER 不会弹出(这是正确的)但是如果我的位置已启用并且网络数据被禁用,则 NETWORK_PROVIDER也没有弹出...请问有什么想法吗?

【问题讨论】:

【参考方案1】:

两者都是位置提供者的类型

NETWORK_PROVIDER 网络位置提供商的名称。

GPS_PROVIDER GPS 位置提供商的名称。

我认为您正在考虑将 NETWORK_PROVIDER 作为移动数据,不是吗? 禁用移动数据并不意味着您正在禁用 LocationManager.NETWORK_PROVIDER

根据您的输入,这里是测试仅移动数据是否打开/关闭或任何网络WIFI或移动数据打开/关闭。

public class ConnectivityUtils 

    // Returns TRUE any network mobile data or WIFI turned on otherwise returns FALSE
    public static boolean isNetworkConnected(@NonNull Context context) 
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    

    // Returns TRUE only if mobile data is turned on otherwise returns FALSE
    public static boolean isMobileDataConnected(@NonNull Context context) 
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        return mobile != null && mobile.isConnectedOrConnecting();
    

【讨论】:

我只想在禁用移动数据时给我一个警报对话框。有没有办法做到这一点而不是检查NETWORK_PROVIDER是否被禁用? 感谢您澄清您的问题,因此已使用代码示例编辑了我之前的答案,如果适合您,请查看并更新答案为已接受。 好的,我会试试你提供的代码!还有一件事......我应该如何调用这个类?我的意思是我应该在 () 里面放什么参数?对不起,我是新手 :D 只需要传递应用程序上下文,在您的情况下,从if (!ConnectivityUtils.isNetworkConnected(this)) // show your dialog等活动调用此方法 现在活动 onCreate 方法应该是这样的 @Override public void onCreate(Bundle savedInstanceState) if (!ConnectivityUtils.isNetworkConnected(this)) // Show your own dialog here Toast.makeText(this, "You are not connected,Connect to wifi or mobile data and try again", Toast.LENGTH_SHORT).show(); return; 如果对你有用,请告诉我,不要忘记接受答案

以上是关于Android:isProviderEnabled(LocationManager.NETWORK_PROVIDER) 不起作用。只有 isProviderEnabled(LocationManage的主要内容,如果未能解决你的问题,请参考以下文章