Articles of telephonymanager

SubscriptionInfo.getMnc()为具有不同运营商的两个SIM返回相同的值

我试图获得MCC和MNC号码(基本上我想要IMSI号码但这些也足够了)在Android 5.1设备中具有双Sim(两者都有效)。 由于5.1支持双Sim,所以我使用了这样的Subscription管理器: SubscriptionManager manager = SubscriptionManager.from(this); List sil = manager.getActiveSubscriptionInfoList(); if (sil != null) { for (SubscriptionInfo subInfo : sil) { Log.v(“TestMain”, “SubInfo:” + subInfo); } } else { Log.v(“TestMain”, “SubInfo: list is null”); } 得到了这个输出: 07-24 18:28:32.162 3844-3844/? V/TestMain﹕ SubInfo:{id=1, mcc 405 mnc 803, iccId=89918030914128062059 simSlotIndex=0 displayName=Aircel Karnataka carrierName=Aircel — Aircel Karnataka nameSource=0} […]

在android中以编程方式获取电话号码

我正在使用代码 TelephonyManager tMgr =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); mPhoneNumber = tMgr.getLine1Number(); 在android中以编程方式获取手机。 但这只适用于一张SIM卡。 如果我通过插入其他SIM卡测试此代码,它将给出null 。 我试图find解决方案。 请帮帮我。 我还在Manifest包含了READ_PHONE_STATE权限。 我想要唯一识别SIM卡。 有没有其他方法可以做到这一点。 请告诉我。 提前致谢…

Android,TelephonyManager,PhoneStateListener和传入号码的乐趣

我刚刚进入Android开发阶段,并决定我对这个新领域的首次征服将是掌握手机对来电的反应。 稍微用谷歌搜索引导我到http://www.compiletimeerror.com/2013/08/android-call-state-listener-example.html#.Vi3Ren4vfwM (所以我的代码与他/她的代码有着惊人的相似之处)。 我的主要(也是唯一)活动如下所示: import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import android.view.Menu; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); TelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } class […]

使用双SIM卡设备中的指定SIM拨打电话

过去几天我一直在寻找这个,我开始知道: “开箱即用的Android不支持双SIM卡。这是制造商的自定义修改,并且没有公共API来控制它。” 下面的链接提供了一个解决方案,但它不能在我的手机三星Galaxy S4 Mini上运行。 从第二个sim调用 我也find了这个链接,我发现它非常有用。 http://www.devlper.com/2010/06/using-android–telephonymanager/ 现在我知道使用下面的代码,我可能有幸运行它: Intent callIntent = new Intent(Intent.ACTION_CALL) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); callIntent.setData(Uri.parse(“tel:” + phone)); context.startActivity(callIntent); callIntent.putExtra(“com.android.phone.extra.slot”, 0); //For sim 1 and callIntent.putExtra(“com.android.phone.extra.slot”, 1); //For sim 2 我不确定这一点,但我有一个问题。 在SIM卡管理器部分下的设置中,当我必须为语音呼叫选择首选SIM卡时,我有四个选项: 当前网络 总是问 SIM 1 SIM 2 当我选择“始终询问”选项时,在拨打电话之前,我总是被要求选择一个显示在对话框中的SIM卡来拨打电话。 我的问题是我可以在我的应用程序中利用这个东西,我按下按钮拨打电话,但它总是问我,当我选择Ask Always选项时它的方式相同。 对不起,我把这个问题写得很冗长,但我认为这需要它。 请提前帮助和非常感谢。 编辑: 每次按下任何按钮(类似于“设置”中的“始终询问”选项)时,如何实现此目的:

MarshMallow警告“不建议获取设备标识符”后的唯一Android设备ID?

我看到了一个我最好的问题是否有一个独特的Android设备ID? 我使用了一些以下代码来获取唯一ID。 public static String getDeviceId(Activity context) { PermissionsChecker checker = new PermissionsChecker(context); if (checker.lacksPermissions(Manifest.permission.READ_PHONE_STATE)) PermissionsActivity.startActivityForResult(context, 0, REQUIRED_PERMISSION); else { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice = tm.getDeviceId(); final String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32)); return deviceUuid.toString(); } return null; } 但我在hover时会收到一些警告 tm.getDeviceId(); 和 Settings.Secure.getString(context.getContentResolver(), […]

使用Android获取当前的互联网速度(移动和Wifi)

我有一个必须在离线和在线模式下工作的应用程序。 应用程序必须根据当前网络连接(Wifi或数据)的Internet速度向应用程序服务器发出请求。 如果连接了Wifi,我可以使用此代码获得当前连接的Wifi信号强度。 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int level = wifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5); 要么 wifiInfo.getLinkSpeed(); 如果移动互联网已连接,我可以使用监听器类获得信号强度 @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); int obj = signalStrength.getGsmSignalStrength(); int dBm = (2 * obj) -113; } 上面的代码获得信号强度,而不是速度。 那么,我如何获得连接网络的当前速度? 通常,在商店或网站中find的速度测试应用程序通过发送或下载特定文件或ping远程服务器然后使用经过的时间计算速度来检查速度。 我正在与之通信的应用服务器不支持此上传/下载或pingfunction,因此我无法使用它。 那么,有没有其他方法可以检查当前可以实时完成的互联网连接的速度? 任何线索都可能有所帮助。 PS:此链接具有用于检查当前网络的连接types的代码。 但有些情况下我的LTE信号具有完整的强度但没有/非常慢的互联网连接。 所以,对我来说,这也不是一个准确的解决方案。 https://gist.github.com/emil2k/5130324 谢谢

如何为特定来电提供定制振动

该程序的function如下:用户有一个电话号码列表,只有当没有其他系统范围的应用程序提供振动时(例如静音模式),手机才能在来电时振动。 我知道这是违反规则的,因为应用程序应该尊重用户的设置,但应用程序仅限于某些具有此需求的用户。 我尝试了两种方法,但它们都不令人满意: 收听电话状态并使用我自己的模式直接触发振动服务(使用Vibrator.vibrate() )。 当手机处于CALL_STATE_RINGING状态时,此方法有效,没有来电但随机有效,我猜这是因为与系统范围的应用程序实际处理来电时的振动冲突。 判断手机是否在来电时振动(使用AudioManager.shouldVibrate() ),并决定是否更改振动设置(使用AudioManager.setRingerMode()和AudioManager.setVibrateSetting() )。 如果我的应用程序更改了振动设置,则一旦手机返回CALL_STATE_IDLE状态,它们将被恢复。 然而,这种方法有时仍然不起作用,没有任何迹象。 我希望有人可以就这个问题提出一些建议。 欢迎对这两种方式或其他建议的评论。

如何以编程方式获取设备的电话号码

我正在尝试使用以下方法获取电话: private String getMyPhoneNumber() { TelephonyManager mTelephonyMgr; mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); //String imsi = mTelephonyMgr.getSubscriberId(); String phnNo = mTelephonyMgr.getLine1Number(); if (phnNo == null) { phnNo = getNoFromWatsApp(); } return phnNo; } private String getNoFromWatsApp(){ AccountManager am = AccountManager.get(this); Account[] accounts = am.getAccounts(); String phoneNumber = “”; for (Account ac : accounts) { String acname = ac.name; […]

如何知道被叫方接听电话(他解除电话时的电话状态是什么)

我试图知道当被叫者举起电话时如何提醒。 我已经使用PhoneStateListener和BroadcastReceiver 。 通常它有三种状态CALL_STATE_IDLE , CALL_STATE_OFFHOOK, CALL_STATE_RINGING 。 当呼叫连接时, CALL_STATE_OFFHOOK状态正在呼叫,在被呼叫者应答呼叫后,没有呼叫上述三种状态的状态。 这是我的BroadcastReceiver。 public class PhoneStateBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE); } public class CustomPhoneStateListener extends PhoneStateListener { Context context; //Context to make Toast if required ActivityManager activityManager; public CustomPhoneStateListener(Context context) { super(); […]

如何监控SIM状态变化

我希望能够在SIM状态改变时做一些事情,即在需要SIM PIN时播放声音,但我认为没有广播事件可以被广播接收器截获…注册android.intent.action .PHONE_STATE只会告诉你CALL-STATE何时发生更改。另一种方法是启动一个注册PhoneStateListener的服务并对LISTEN_SERVICE_STATE作出反应(当状态为OUT-OF-STATE时它可以获取SIM从TelephonyManager状态并查看状态是否为SIM_STATE_PIN_REQUIRED)。 所以,我的问题是: 1)是否有任何广播意图可用于拦截SIM状态更改或服务状态更改? 2)在PhoneStateListener接收到电话状态改变的通知后,在服务中安装PhoneStateListener并使用它向服务本身传递意图是一个坏主意吗?