V2地图库是否需要ACCESS_NETWORK_STATE权限?

12

我在我的发布应用程序中使用Android V2 Google地图库(Google Play服务)。我一直看到零星的异常出现在Google Play中,似乎支持地图片段偶尔尝试检查网络状态。然而,库文档没有提到需要此权限。我在应用程序中没有直接检查网络状态,因此我没有声明此权限。结果,在充气支持映射片段时有时会抛出SecurityException

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.foo/com.foo.ui.TransactionDetailActivity}: android.view.InflateException: Binary XML file line #327: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5039)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #327: Error inflating class fragment
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:459)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
    at com.actionbarsherlock.internal.ActionBarSherlockNative.setContentView(SourceFile:119)
    at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SourceFile:262)
    at com.foo.ui.TransactionDetailActivity.onCreate(SourceFile:129)
    at android.app.Activity.performCreate(Activity.java:5104)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    ... 11 more
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10106 nor current process has android.permission.ACCESS_NETWORK_STATE.
    at android.os.Parcel.readException(Parcel.java:1425)
    at android.os.Parcel.readException(Parcel.java:1379)
    at android.net.IConnectivityManager$Stub$Proxy.getActiveNetworkInfo(IConnectivityManager.java:623)
    at android.net.ConnectivityManager.getActiveNetworkInfo(ConnectivityManager.java:425)
    at maps.bm.e.e(Unknown Source)
    at maps.bm.e.a(Unknown Source)
    at maps.z.ag.a(Unknown Source)
    at maps.z.ag.a(Unknown Source)
    at maps.z.ag.a(Unknown Source)
    at maps.z.bw.a(Unknown Source)
    at maps.z.r.onCreateView(Unknown Source)
    at com.google.android.gms.maps.internal.IMapFragmentDelegate$Stub.onTransact(IMapFragmentDelegate.java:107)
    at android.os.Binder.transact(Binder.java:310)
    at com.google.android.gms.maps.a.l.a(Unknown Source)
    at com.google.android.gms.maps.m.a(Unknown Source)
    at com.google.android.gms.internal.ap.a(Unknown Source)
    at com.google.android.gms.internal.al.a(Unknown Source)
    at com.google.android.gms.internal.al.a(Unknown Source)
    at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
    at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:846)
    at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1061)
    at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1160)
    at android.support.v4.app.FragmentActivity.onCreateView(SourceFile:272)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
    ... 28 more

我已在清单文件中声明了相关权限,将看看是否能解决问题。然而,令人担忧的是,这只会在一些设备上发生,而不是所有设备。例如,在我们的内部测试设备和许多其他设备上,这个问题都可以正常工作。有人对这个神秘的问题有什么见解吗?可能是由 Proguard 错误引起的吗?

编辑 1:此错误发生在使用Google Play服务库版本2.0.10(541717-10)时。


我在想是否问题的原因并不一定是某些设备,而是某些状态?例如,可能是从WiFi到3G或者反过来的奇怪转换引起的问题?或者只有在信号非常差的情况下才会出现问题?等等... - Scott W
可以实现,但如果需要该权限,则应记录其使用情况。 - twaddington
2
从你的追踪记录来看,Maps V2 正在调用“getActiveNetworkInfo()”,该方法的文档表明它需要“ACCESS_NETWORK_STATE”。 - CommonsWare
1
最令人困惑的部分是为什么它在实验室中能够工作 - 我也从未需要过这个权限。他们必须在某些特定条件下进行此调用,这些条件通常不会出现。 - CommonsWare
1
你是否在SDK管理器中使用了最新版本的“Google Play服务”?我的显示Rev 4是当前版本。 - CommonsWare
显示剩余4条评论
2个回答

1

随着Google Play服务库的最新版本发布,文档已更新以指示需要此权限。

发行说明说明了为什么需要此权限:

改进了从获得网络连接中恢复的功能。此修复程序需要ACCESS_NETWORK_STATE权限。


0

是的。任何使用 getActiveNetworkInfo() 方法都需要网络状态访问权限。

在您的清单文件中添加以下行即可:

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

谢谢,我已经将该权限添加到我的应用程序中,并解决了问题。我想真正的问题是为什么映射库在没有记录需要此权限的情况下调用“getActiveNetworkInfo”。 - twaddington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接