java - Android 电话 API 不会在 4G 手机上返回 cellsignalstrength
问题描述
我正在尝试检索手机信号强度并在基于 4G 的手机上显示。我的手机版本是 LND-AL30 8.0.0.203 (C675)。这是否意味着我有 api 级别为 30 的 android ver 8?如果是这样,我可以使用哪个 Api 来获取信号强度?
问题:当应用程序启动并且位置信息被禁用时,应用程序运行正常但检索到零长度的 cellInfo 对象 (tm.getAllCellInfo)。所以,我根本无法获得信号强度。
而如果我在手机上打开位置信息,应用程序会崩溃并出现异常:没有虚拟方法 cellInfo.getCellSignalStrength。您能否建议如何克服这个问题并检索细胞信号强度?
下面是我正在使用的 android sdk 版本。
构建.gradle
android {
compileSdk 31
defaultConfig {
applicationId "com.example.mobilenetworkinfo"
minSdk 31
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
具有所需权限的 Manifest.xml 文件:
uses-permission android:name="android.permission.READ_PHONE_STATE"
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
uses-permission android:name="android.permission.INTERNET"
和 MainActivity.java 文件:
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.telephony.*;
public class MainActivity extends AppCompatActivity {
private final int REQUEST_READ_PHONE_STATE=1;
private final int REQUEST_ACCESS_COARSE_LOCATION=2;
private final int REQUEST_ACCESS_FINE_LOCATION=3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("onCreate", "added hello from onCreate");
}
@SuppressLint({"NewApi", "MissingPermission"})
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public void sendMessage(View view) {
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
} else {
//TODO
}
int permissionCheck2 = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION);
if (permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_ACCESS_COARSE_LOCATION);
} else {
//TODO
}
int permissionCheck3 = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck3 != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_ACCESS_FINE_LOCATION);
} else {
//TODO
}
Intent intent = new Intent(this, DisplayMessageActivity.class);
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
intent.putExtra("IMEI", tm.getImei());
intent.putExtra("SIM serial number", tm.getSimSerialNumber());
Integer i=0;
for( CellInfo cellInfo: tm.getAllCellInfo()) {
//for( i =1; i <= 6;i++){
i++;
intent.putExtra("cellSignalStrength"+i.toString(),
cellInfo.getCellSignalStrength().getDbm()+"");
}
intent.putExtra("CELLCOUNT", i+"");
Log.i("First", "added hello and count is " + i.toString());
startActivity(intent);
}
@SuppressLint({"MissingPermission", "NewApi"})
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[]
grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_READ_PHONE_STATE:
if ((grantResults.length > 0) && (grantResults[0] ==
PackageManager.PERMISSION_GRANTED)) {
}
break;
default:
break;
}
}
}
解决方案
您正在使用 SDK 级别 18 进行编译。getSignalStrength 刚刚添加到 API 30 中。您需要将目标 SDK 版本设置为至少 30(并在至少 30 的设备上运行)才能编译。您可能还希望将 minSDK 版本设为 30,或者您需要在调用它之前检查 API 级别。
推荐阅读
- internet-explorer - 2018 年及以后支持 Firefox 3.6/Opera 10.50/IE 8
- node.js - ExpressJS 同步 HTTP 请求处理
- graphql - Strapi.io graphQL 突变
- amazon-web-services - 创建 IAM 角色时无效的ClientTokenId
- python - 如何在django模板中循环显示外键中的所有类别图像?
- c# - 使用实体框架的 Azure 函数返回空结果
- c++ - CreateThread 的 threadProc 竞争条件
- python - AttributeError:“_io.TextIOWrapper”对象没有属性“编码”
- python - pysftp 连接更改目录不起作用
- json - 如何从 postgres JSONB 列中获取值?