需要振动权限,尽管权限已在清单中声明

11
我希望在点击按钮时使我的设备振动。但是它总是抛出一个java.lang.SecurityException: Requires VIBRATE permission错误,尽管我已经在清单文件中获取了VIBRATE权限。
我知道从API 23开始,应用程序必须在运行时请求一些权限,但是根据这个链接,Vibrate权限是无需要求即可授予的。
有什么想法吗?
方法代码:
 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_settings:
            // User chose the "Settings" item, show the app settings UI...
            return true;

        case R.id.share:
            // User chose the "Favorite" action, mark the current item
            // as a favorite...
            return true;
        case R.id.sync:
            Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            // Vibrate for 500 milliseconds
            v.vibrate(500); //MainActivity line 832
            getRemoteItems();

        default:
            // If we got here, the user's action was not recognized.
            // Invoke the superclass to handle it.
            return super.onOptionsItemSelected(item);

    }
}

AndroidManifest.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pigmalionstudios.todolist">
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<application
    <activity
        android:name=".Activities.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

编辑:

错误信息:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.pigmalionstudios.todolist, PID: 3380
              java.lang.SecurityException: Requires VIBRATE permission
                  at android.os.Parcel.readException(Parcel.java:2004)
                  at android.os.Parcel.readException(Parcel.java:1950)
                  at android.os.IVibratorService$Stub$Proxy.vibrate(IVibratorService.java:163)
                  at android.os.SystemVibrator.vibrate(SystemVibrator.java:77)
                  at android.os.Vibrator.vibrate(Vibrator.java:178)
                  at android.os.Vibrator.vibrate(Vibrator.java:97)
                  at android.os.Vibrator.vibrate(Vibrator.java:76)
                  at com.pigmalionstudios.todolist.Activities.MainActivity.onOptionsItemSelected(MainActivity.java:832) //This line of code is v.vibrate(500);
                  at android.app.Activity.onMenuItemSelected(Activity.java:3450)
                  at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:368)
                  at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
                  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
                  at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108)
                  at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:65)
                  at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:202)
                  at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780)
                  at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
                  at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
                  at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
                  at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963)
                  at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624)
                  at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150)
                  at android.view.View.performClick(View.java:6294)
                  at android.view.View$PerformClick.run(View.java:24770)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

好的,这很简单。你在测试哪个设备?我刚刚创建了一个使用 onOptionsItemSelected() 中的 vibrate() 的废弃项目,并且在运行 Android 7.1.1 的 Nexus 9 上,它可以正常工作,需要 VIBRATE 权限。 - CommonsWare
我正在使用Android 8.1.0的LG Nexus 5X。 - Benjamin Heinke
1
这真的是最终出现在你的 APK 中的清单吗?请在应用程序的 build/intermediates/manifests/full/... 下检查合并的清单。 - laalto
从我最近的博客文章中引用自己(https://commonsware.com/blog/2018/02/06/vet-your-manifest.html):“使用Android Studio中的“合并清单”子选项卡,查看来自所有来源的清单内容。使用APK分析器(https://developer.android.com/studio/build/apk-analyzer.html)再次进行检查,以查看生产APK中清单的内容。” - CommonsWare
1
@CommonsWare 在您的博客中写得非常好!好的,这是我做的:我打开了MergedManifest并检查了权限是否存在,它确实存在。然后我分析了我的APK并检查了清单和振动权限也在那里。然后我运行我的应用程序,但它立即崩溃了。我卸载了它并重新安装了它,现在它可以振动了,但我没有改变任何东西。我想通过打开这两个清单中的一个来进行某种“清单刷新”,现在它可以工作了。谢谢,我在这里学到了很多! - Benjamin Heinke
显示剩余6条评论
1个回答

8

我遇到了相同的问题,修复它的方法是重新构建你的应用。

改变代码会导致React Native刷新你的应用,但似乎不会重新加载AndroidManifest.xml。

因此,只需要手动再次运行react-native run-android即可。


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