标签: telephonymanager

如何监控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)ServiceStateListener接收到电话状态改变的通知后,在服务中安装PhoneStateListener并使用它向服务本身传递意图是一个坏主意吗?

android broadcastreceiver android-service telephonymanager

25
推荐指数
2
解决办法
3万
查看次数

以编程方式结束来电

这是SO中一个熟悉的问题.我需要的是以编程方式结束通话.我经常搜索过......

http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html http://androiddesk.wordpress.com/2012/08/02/blocking-a-call-without-user-intervention -in-的Android /

在android中拒绝来电

如何以编程方式回答/结束Android 4.1中的通话?

http://www.emoticode.net/android-sdk/block-incoming-and-outgoing-phone-calls-programmatically.html

如何在android中阻止调用

如何在Android应用程序开发中阻止手机号码呼叫和消息接收?

http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html

还有更多问题,答案和建议......

所有人都说ITelephonyService.aidlTelephonyManager结合使用

并且该解决方案在许多设备上都运行良好,但它不适用于Samsung S Duos.我挣扎了一个星期,但没有得到解决方案..是否有任何特殊的API可以在这种类型的设备上工作?我如何拒绝来电?请帮我...

android telephony telephonymanager

24
推荐指数
1
解决办法
2万
查看次数

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

该程序的功能如下:用户有一个电话号码列表,只有当没有其他系统范围的应用程序提供振动时(例如静音模式),手机才能在来电时振动.我知道这是违反规则的,因为应用程序应该尊重用户的设置,但应用程序仅限于某些具有此需求的用户.我尝试了两种方法,但它们都不令人满意:

  1. 收听电话状态并使用我自己的模式直接触发振动服务(带Vibrator.vibrate()).当手机处于CALL_STATE_RINGING状态时,此方法有效,没有来电但随机有效,我猜这是因为与系统范围的应用程序冲突,实际上处理来电时的振动.

  2. 判断手机是否在来电时振动AudioManager.shouldVibrate(),并决定是否更改振动设置(使用AudioManager.setRingerMode()AudioManager.setVibrateSetting()).如果我的应用程序更改了振动设置,则一旦手机恢复CALL_STATE_IDLE状态,它们将被恢复.然而,这种方法有时仍然无法正常工作,没有任何原因.

我希望有人可以就这个问题提出一些建议.欢迎对这两种方式或其他建议的评论.

android vibration telephonymanager android-audiomanager

22
推荐指数
1
解决办法
1951
查看次数

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

我试图知道当被叫者举起电话时如何提醒.我已经使用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();
            this.context = context;
        }

        @Override
        public void onCallStateChanged(int state, String incomingNumber) 
        {
            super.onCallStateChanged(state, incomingNumber);
            Log.v("PhoneStateBroadcastReceiver", "onCallStateChanged state"+state);


            switch (state) 
            {
            case TelephonyManager.CALL_STATE_IDLE: …
Run Code Online (Sandbox Code Playgroud)

android phone-call telephonymanager

20
推荐指数
1
解决办法
1371
查看次数

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

过去几天我一直在寻找这个,我开始知道:

"开箱即用的Android不支持双SIM卡.这是制造商的自定义修改,并且没有公共API来控制它."

下面的链接提供了一个解决方案,但它不能在我的手机三星Galaxy S4 Mini上工作.

从第二个sim打电话

我也找到了这个链接,我发现它非常有用.

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
Run Code Online (Sandbox Code Playgroud)

我不确定这一点,但我有一个问题.

在SIM卡管理器部分下的设置中,当我必须为语音呼叫选择首选SIM卡时,我有四个选项:

  1. 当前网络
  2. 总是问
  3. SIM 1
  4. SIM 2

当我选择"始终询问"选项时,在拨打电话之前,我总是被要求选择一个显示在对话框中的SIM卡来拨打电话.我的问题是我可以在我的应用程序中利用这个东西,我按下按钮拨打电话,但它总是问我,当我选择Ask Always选项时它的方式相同.

对不起,我把这个问题写得很冗长,但我觉得它需要它.请提前帮助和非常感谢.

编辑:

每次按下任何按钮(类似于"设置"中的"始终询问"选项)时,如何实现此目的: 选择SIM对话框

android android-intent telephonymanager

17
推荐指数
2
解决办法
5万
查看次数

使用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);
Run Code Online (Sandbox Code Playgroud)

要么

wifiInfo.getLinkSpeed();
Run Code Online (Sandbox Code Playgroud)

如果移动互联网已连接,我可以使用监听器类获得信号强度

@Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        int obj  = signalStrength.getGsmSignalStrength();
        int dBm = (2 * obj) -113;
 }
Run Code Online (Sandbox Code Playgroud)

上面的代码获得信号强度,而不是速度.那么,我如何获得连接网络的当前速度?

通常,在商店或网站中找到的速度测试应用程序通过发送或下载特定文件或ping远程服务器然后使用经过的时间计算速度来检查速度.

我正在与之通信的应用服务器不支持此上传/下载或ping功能,因此我无法使用它.

那么,有没有其他方法可以检查当前可以实时完成的互联网连接的速度?

任何线索都可能有所帮助.

PS:此链接具有用于检查当前网络的连接类型的代码.但在某些情况下,我的LTE信号具有完整的强度但没有/非常慢的互联网连接.所以,对我来说,这也不是一个准确的解决方案.

https://gist.github.com/emil2k/5130324

谢谢

android wifimanager android-wifi telephonymanager

17
推荐指数
1
解决办法
1万
查看次数

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;
}
Run Code Online (Sandbox Code Playgroud)

但是我在悬停时会收到一些警告

tm.getDeviceId();

Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); 如下:

建议不要使用getString来获取设备标识符.

除高价值防欺诈和高级电话用例外,不建议使用设备标识符.对于广告用例,请使用AdvertisingIdClient $ Info#getId并使用InstanceId#getId进行分析.

有什么解决方案吗?它有害还是其他什么?

android telephonymanager android-identifiers android-settings

16
推荐指数
1
解决办法
8733
查看次数

tm.getDeviceId()已弃用?

我正在获取IMEI和设备ID,所以我在这里得到一个问题getDeviceId()已被弃用.

TelephonyManager tm = (TelephonyManager) 
                 getSystemService(this.TELEPHONY_SERVICE);

imei = tm.getDeviceId();
device = Settings.Secure.getString(this.getContentResolver(),
           Settings.Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

java android telephonymanager android-8.0-oreo

15
推荐指数
3
解决办法
2万
查看次数

Android 11 中的 GetNetworkType

根据此处发布的更改,Android R 及以后不推荐使用 getNetworkType 方法。

在 R 编译的应用程序中尝试使用此方法时,会导致抛出以下异常:

java.lang.SecurityException: getDataNetworkTypeForSubscriber: uid 10225 does not have android.permission.READ_PHONE_STATE.
  at android.os.Parcel.createExceptionOrNull(Parcel.java:2285)
  at android.os.Parcel.createException(Parcel.java:2269)
  at android.os.Parcel.readException(Parcel.java:2252)
  at android.os.Parcel.readException(Parcel.java:2194)
  at com.android.internal.telephony.ITelephony$Stub$Proxy.getNetworkTypeForSubscriber(ITelephony.java:7565)
  at android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:2964)
  at android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:2928)
  at com.ironsource.environment.ConnectivityService.getCellularNetworkType(ConnectivityService.java:197)
  at com.ironsource.sdk.service.DeviceData.updateWithConnectionInfo(DeviceData.java:98)
  at com.ironsource.sdk.service.DeviceData.fetchMutableData(DeviceData.java:54)
  at com.ironsource.sdk.service.TokenService.collectDataFromDevice(TokenService.java:120)
  at com.ironsource.sdk.service.TokenService.getRawToken(TokenService.java:177)
  at com.ironsource.sdk.service.TokenService.getToken(TokenService.java:166)
  at com.ironsource.sdk.IronSourceNetwork.getToken(IronSourceNetwork.java:183)
Run Code Online (Sandbox Code Playgroud)

这很好,根据文档是预期的。如果我将应用程序编译为 Android R 之前的任何版本,则不会显示异常。

此异常表示我需要请求android.permission.READ_PHONE_STATE权限。

我想知道是否有办法使用不需要此权限的任何其他 API 获取网络类型(因为此权限的级别很危险,我宁愿不要求用户提供)。

telephonymanager android-11

15
推荐指数
1
解决办法
8585
查看次数

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

我试图在具有双Sim(两者都有效)的Android 5.1设备中获取MCC和MNC号码(基本上我想要IMSI号码但这些也足够了).由于5.1支持双Sim,所以我使用了这样的Subscription管理器:

SubscriptionManager manager = SubscriptionManager.from(this);
List<SubscriptionInfo> sil = manager.getActiveSubscriptionInfoList();
    if (sil != null) {
        for (SubscriptionInfo subInfo : sil) {
            Log.v("TestMain", "SubInfo:" + subInfo);
        }
    } else {
        Log.v("TestMain", "SubInfo: list is null");
    }
Run Code Online (Sandbox Code Playgroud)

得到了这个输出:

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}
07-24 18:28:32.162    3844-3844/? V/TestMain? SubInfo:{id=2,  mcc 405 mnc 803, iccId=8991860044481968955 simSlotIndex=1 displayName=CARD 2 carrierName=Vodafone Karnataka nameSource=0}
Run Code Online (Sandbox Code Playgroud)

MCC(将与同一个国家/地区相同)注意到虽然运营商不同,但MNC是相同的.

当我关掉手机时,我在logcat中看到了这一行:

07-24 18:31:02.295      616-616/? V/KeyguardUpdateMonitor? SubInfo:{id=1,  mcc 405 mnc …
Run Code Online (Sandbox Code Playgroud)

android android-source telephonymanager dual-sim android-5.1.1-lollipop

14
推荐指数
1
解决办法
2072
查看次数