TelephonyManager 在 android studio 上崩溃

TelephonyManager crashing on android studio

我已将我的 eclipse 代码转移到 android studio,我尝试在 studio 上执行该项目,但它在 TelephonyManager 上崩溃了。我在 Theme.Holo.Light 上创建了旧代码。

我已添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- Required to show current location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Class:

public class MainActivity extends Activity {

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


        final TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        final String tmDevice, tmSerial, androidId;
        if (tm.getDeviceId() != null) {
            tmDevice = "" + tm.getDeviceId();
            tmSerial = "" + tm.getSimSerialNumber();
            androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
            UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());

            String appdeviceId = deviceUuid.toString();

            Toast.makeText(getBaseContext(),appdeviceId,Toast.LENGTH_LONG).show();
        }
    }


}

Logcat:

java.lang.RuntimeException: Unable to start activity ava.lang.SecurityException: Neither user 10101 nor current process has android.permission.READ_PHONE_STATE.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.SecurityException: Neither user 10101 nor current process has android.permission.READ_PHONE_STATE.
            at android.os.Parcel.readException(Parcel.java:1546)
            at android.os.Parcel.readException(Parcel.java:1499)
            at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:3692)
            at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:624)
            at example.com.telephoney_manager_test.MainActivity.onCreate(MainActivity.java:24)
            at android.app.Activity.performCreate(Activity.java:5990)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)

在清单中添加此权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

所以你已经在你的问题中提到你已经拥有 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 权限。这意味着不会发生!

很遗憾,您的 android 工作室无法正确构建项目。它无法刷新清单以加载权限。

因此,请尝试重建您的项目(清理、构建)。如果它没有帮助,您可以尝试 this 此处似乎有效的有点奇怪的解决方案。

作为注意 检查整个清单文件。某些包名称更改或放错 data/names 可能会导致此错误。

我已将权限粘贴到应用程序标签下方。我将权限粘贴到应用程序标签上方,一切正常。

我用 Android Studio (1.4 Beta 4) 和 Nexus 6 运行 Android M 预览版讨论了这个主题。

我可以通过 运行 应用一次(收到异常)解决问题,然后转到设置 -> 应用 -> 我的应用 -> 显示(惊喜,惊喜!)所有请求权限的权限并且所有权限都已关闭。

然后我手动打开所有权限并再次从 Android Studio 启动应用程序。自此权限问题消失了。

如果您的目标是 API 23,那么您需要请求任何运行时权限,这些权限来自您的清单:

<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.WRITE_EXTERNAL_STORAGE" />

每次重新安装应用程序时都是如此,这可能很乏味。

您的选择:

1) 使用“-g”选项安装。这将授予您合理允许的所有您请求的权限。

$ adb install -g myapp.apk

2) 使用 PackageManager 在运行时授予您需要的权限:

$ adb shell pm grant com.myapp "android.permission.READ_PHONE_STATE"

如果您的目标是 API 23,那么您需要请求任何运行时权限。下面是该问题的解决方法:更改 build.gradle 的文件,将 targetSdkVersion 的值更改为低于 23.