如何在android 10中不使用READ_PHONE_STATE权限获取网络连接类型



android 10正在改变的一件事是,我们无法自动获得READ_PHONE_STATE,并且必须通过转到应用程序信息来指示用户手动授予权限>权限>电话>打开

有没有任何方法可以在android 10及以上版本上获得网络状态(如果手机在wifi/3g等)不指示用户自己转到应用程序设置并手动更改权限?

我想绕过的许可请求

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActivityNetwork());
boolean isMobile = caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
boolean isWifi = caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);

这样就可以了,然后就不需要使用READ_PHONE_STATE权限了吗?

有一个类NetworkInfo,它有一个函数返回字符串值包含MOBILEWIFIgetTypeName()

我试着写函数,我希望它能对你有所帮助:

/**
* @param mType : type of network connection "MOBILE" or "WIFI"
* @return : true of false
*/
public boolean isMyType(String mType) {
ConnectivityManager connectivityManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
//
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
return activeNetworkInfo.getTypeName().equals(mType);
} else {
// no internet connection
return false;
}
}

你可以称之为


boolean isMobile = isMyType("MOBILE");
boolean isWifi = isMyType("WIFI");
// for logcat debug
Log.i("typeNetwork", "is mobile :" + isMobile);
Log.i("typeNetwork", "is wifi :" + isWifi);

如果这对你有用的话,请告诉我。。

Kotlin版本对上述答案-

val connectivityManager =
context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
val activeNetworkInfo: NetworkInfo? = connectivityManager?.activeNetworkInfo
if (activeNetworkInfo != null && activeNetworkInfo.isConnected) {
return if (activeNetworkInfo.typeName.equals("WIFI")) {
Log.d("prattham", "getNetworkSpeed: -> activeNetworkInfo is WIFI ")
} else if (activeNetworkInfo.typeName.equals("MOBILE")) {

}else{

}
} else {
// no internet connection

}

最新更新