[jira] [Commented] (CB-13026) java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity
[ https://issues.apache.org/jira/browse/CB-13026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16161640#comment-16161640 ] Joe Bowser commented on CB-13026: - I would greatly prefer to not use ContextCompat in the cordova-android core, partly because this is going to blow up plugins that also use the Android compat. We're integration cordova-plugin-compat back into Cordova-Android. Adding the Android compatibility library as a dependency on cordova-android itself would add a lot of complexity w.r.t. licence files (even though both are Apache licensed, less dependencies are better). > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity > --- > > Key: CB-13026 > URL: https://issues.apache.org/jira/browse/CB-13026 > Project: Apache Cordova > Issue Type: Bug > Components: cordova-android >Affects Versions: cordova@7.0.0 >Reporter: Alex B. >Assignee: Joe Bowser > Labels: bug > Fix For: 7.0.0 > > > h3. The problem > Problem reproduced on Android 5.1.1 (API level 22), on all my devices which > below API level 23 > Problematic part of code > {code:java} > public class HelloWorldBridge extends CordovaPlugin { > String [] permissions = { > Manifest.permission.CALL_PHONE, > Manifest.permission.INSTALL_SHORTCUT }; > private static int REQUEST_CODE_PERMISSION = 0; > @Override protected void pluginInitialize() { > onStart(); > } > @Override public void onStart() { > cordova.requestPermissions(this, REQUEST_CODE_PERMISSION, > permissions); > } > @Override public void onNewIntent(Intent intent) { > cordova.getActivity().setIntent(intent); > } > @Override > public void onRequestPermissionResult(int requestCode, String[] > permissions, int[] grantResults) throws JSONException { > super.onRequestPermissionResult(requestCode, permissions, > grantResults); > if (requestCode == REQUEST_CODE_PERMISSION) { > for (int r : grantResults) { > if (r == PackageManager.PERMISSION_DENIED) { > return; > } > } > cordova.getActivity().runOnUiThread(new Runnable() { > @Override > public void run() { >Log.d(TAG, "Granted!"); > } > }); > } > } > } > {code} > Stack trace: > {code:java} > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity; or > its super classes (declaration of 'android.app.Activity' appears in > /system/framework/framework.jar) > at > org.apache.cordova.CordovaInterfaceImpl.requestPermissions(CordovaInterfaceImpl.java:226) > at org.mysample.HelloWorldBridge.initDialOnce(DialOnceBridge.java:40) > at > org.mysample.HelloWorldBridge.pluginInitialize(DialOnceBridge.java:27) > at > org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:58) > at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171) > at > org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:97) > at org.apache.cordova.PluginManager.init(PluginManager.java:86) > at > org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:115) > at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:149) > at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:224) > at > com.dialonce.cordova.sample.MainActivity.onCreate(MainActivity.java:39) > at android.app.Activity.performCreate(Activity.java:6092) > at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) > at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) > at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) > at android.app.ActivityThread.access$800(ActivityThread.java:178) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) > at android.os.Handler.dispatchMessage(Handler.java:111) > at android.os.Looper.loop(Looper.java:194) > at android.app.ActivityThread.main(ActivityThread.java:5631) > 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:963) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) > {code} > h3. Investigation > According docs [Activity.requestPermissions | > https://developer.android.com/reference/andr
[jira] [Commented] (CB-13026) java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity
[ https://issues.apache.org/jira/browse/CB-13026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16103988#comment-16103988 ] Filip Maj commented on CB-13026: Linking this up to CB-12730, as we are looking at integrating cordova-plugin-compat into cordova-android anyways. It looks like there may be some additional work to consolidate the way plugins request permissions in cordova-android. > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity > --- > > Key: CB-13026 > URL: https://issues.apache.org/jira/browse/CB-13026 > Project: Apache Cordova > Issue Type: Bug > Components: cordova-android >Affects Versions: cordova@7.0.0 >Reporter: Alex B. >Assignee: Joe Bowser > Labels: bug > Fix For: 7.0.0 > > > h3. The problem > Problem reproduced on Android 5.1.1 (API level 22), on all my devices which > below API level 23 > Problematic part of code > {code:java} > public class HelloWorldBridge extends CordovaPlugin { > String [] permissions = { > Manifest.permission.CALL_PHONE, > Manifest.permission.INSTALL_SHORTCUT }; > private static int REQUEST_CODE_PERMISSION = 0; > @Override protected void pluginInitialize() { > onStart(); > } > @Override public void onStart() { > cordova.requestPermissions(this, REQUEST_CODE_PERMISSION, > permissions); > } > @Override public void onNewIntent(Intent intent) { > cordova.getActivity().setIntent(intent); > } > @Override > public void onRequestPermissionResult(int requestCode, String[] > permissions, int[] grantResults) throws JSONException { > super.onRequestPermissionResult(requestCode, permissions, > grantResults); > if (requestCode == REQUEST_CODE_PERMISSION) { > for (int r : grantResults) { > if (r == PackageManager.PERMISSION_DENIED) { > return; > } > } > cordova.getActivity().runOnUiThread(new Runnable() { > @Override > public void run() { >Log.d(TAG, "Granted!"); > } > }); > } > } > } > {code} > Stack trace: > {code:java} > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity; or > its super classes (declaration of 'android.app.Activity' appears in > /system/framework/framework.jar) > at > org.apache.cordova.CordovaInterfaceImpl.requestPermissions(CordovaInterfaceImpl.java:226) > at org.mysample.HelloWorldBridge.initDialOnce(DialOnceBridge.java:40) > at > org.mysample.HelloWorldBridge.pluginInitialize(DialOnceBridge.java:27) > at > org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:58) > at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171) > at > org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:97) > at org.apache.cordova.PluginManager.init(PluginManager.java:86) > at > org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:115) > at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:149) > at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:224) > at > com.dialonce.cordova.sample.MainActivity.onCreate(MainActivity.java:39) > at android.app.Activity.performCreate(Activity.java:6092) > at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) > at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) > at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) > at android.app.ActivityThread.access$800(ActivityThread.java:178) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) > at android.os.Handler.dispatchMessage(Handler.java:111) > at android.os.Looper.loop(Looper.java:194) > at android.app.ActivityThread.main(ActivityThread.java:5631) > 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:963) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) > {code} > h3. Investigation > According docs [Activity.requestPermissions | > https://developer.android.com/reference/android/app/Activity.html#requestPermissions(java.lang.String[], > int)] this method require Android API 23 > h3. Workaround > Wrap `requestPermissions` code with `if (Build.VERSION.SDK_INT >= > Build.VER
[jira] [Commented] (CB-13026) java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity
[ https://issues.apache.org/jira/browse/CB-13026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16098509#comment-16098509 ] jcesarmobile commented on CB-13026: --- I'm not saying it can't be done or shouldn't be done, but right now using cordova-plugin-compat the plugins work with previous cordova-android versions, not everybody can/want to update. We could update cordova-android to use ContextCompat and some day get rid of the cordova-plugin-compat. Would you mind creating a new issue for it as "Improvement" or "Feature request" > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity > --- > > Key: CB-13026 > URL: https://issues.apache.org/jira/browse/CB-13026 > Project: Apache Cordova > Issue Type: Bug > Components: cordova-android >Affects Versions: cordova@7.0.0 >Reporter: Alex B. >Assignee: Joe Bowser > Labels: bug > Fix For: 7.0.0 > > > h3. The problem > Problem reproduced on Android 5.1.1 (API level 22), on all my devices which > below API level 23 > Problematic part of code > {code:java} > public class HelloWorldBridge extends CordovaPlugin { > String [] permissions = { > Manifest.permission.CALL_PHONE, > Manifest.permission.INSTALL_SHORTCUT }; > private static int REQUEST_CODE_PERMISSION = 0; > @Override protected void pluginInitialize() { > onStart(); > } > @Override public void onStart() { > cordova.requestPermissions(this, REQUEST_CODE_PERMISSION, > permissions); > } > @Override public void onNewIntent(Intent intent) { > cordova.getActivity().setIntent(intent); > } > @Override > public void onRequestPermissionResult(int requestCode, String[] > permissions, int[] grantResults) throws JSONException { > super.onRequestPermissionResult(requestCode, permissions, > grantResults); > if (requestCode == REQUEST_CODE_PERMISSION) { > for (int r : grantResults) { > if (r == PackageManager.PERMISSION_DENIED) { > return; > } > } > cordova.getActivity().runOnUiThread(new Runnable() { > @Override > public void run() { >Log.d(TAG, "Granted!"); > } > }); > } > } > } > {code} > Stack trace: > {code:java} > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity; or > its super classes (declaration of 'android.app.Activity' appears in > /system/framework/framework.jar) > at > org.apache.cordova.CordovaInterfaceImpl.requestPermissions(CordovaInterfaceImpl.java:226) > at org.mysample.HelloWorldBridge.initDialOnce(DialOnceBridge.java:40) > at > org.mysample.HelloWorldBridge.pluginInitialize(DialOnceBridge.java:27) > at > org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:58) > at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171) > at > org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:97) > at org.apache.cordova.PluginManager.init(PluginManager.java:86) > at > org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:115) > at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:149) > at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:224) > at > com.dialonce.cordova.sample.MainActivity.onCreate(MainActivity.java:39) > at android.app.Activity.performCreate(Activity.java:6092) > at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) > at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) > at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) > at android.app.ActivityThread.access$800(ActivityThread.java:178) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) > at android.os.Handler.dispatchMessage(Handler.java:111) > at android.os.Looper.loop(Looper.java:194) > at android.app.ActivityThread.main(ActivityThread.java:5631) > 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:963) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) > {code} > h3. Investigation > According docs [Activity.requestPermissions | > https://developer.android.com/reference/android/app/Activity.html#requestPermissions(java.lang.Str
[jira] [Commented] (CB-13026) java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity
[ https://issues.apache.org/jira/browse/CB-13026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16098113#comment-16098113 ] Alex B. commented on CB-13026: -- Agree with you, but why `org.apache.cordova.CordovaInterfaceImpl.requestPermissions` cannot use `ContextCompat` ? Is there any disadvantage of such approach? > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity > --- > > Key: CB-13026 > URL: https://issues.apache.org/jira/browse/CB-13026 > Project: Apache Cordova > Issue Type: Bug > Components: cordova-android >Affects Versions: cordova@7.0.0 >Reporter: Alex B. >Assignee: Joe Bowser > Labels: bug > Fix For: 7.0.0 > > > h3. The problem > Problem reproduced on Android 5.1.1 (API level 22), on all my devices which > below API level 23 > Problematic part of code > {code:java} > public class HelloWorldBridge extends CordovaPlugin { > String [] permissions = { > Manifest.permission.CALL_PHONE, > Manifest.permission.INSTALL_SHORTCUT }; > private static int REQUEST_CODE_PERMISSION = 0; > @Override protected void pluginInitialize() { > onStart(); > } > @Override public void onStart() { > cordova.requestPermissions(this, REQUEST_CODE_PERMISSION, > permissions); > } > @Override public void onNewIntent(Intent intent) { > cordova.getActivity().setIntent(intent); > } > @Override > public void onRequestPermissionResult(int requestCode, String[] > permissions, int[] grantResults) throws JSONException { > super.onRequestPermissionResult(requestCode, permissions, > grantResults); > if (requestCode == REQUEST_CODE_PERMISSION) { > for (int r : grantResults) { > if (r == PackageManager.PERMISSION_DENIED) { > return; > } > } > cordova.getActivity().runOnUiThread(new Runnable() { > @Override > public void run() { >Log.d(TAG, "Granted!"); > } > }); > } > } > } > {code} > Stack trace: > {code:java} > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity; or > its super classes (declaration of 'android.app.Activity' appears in > /system/framework/framework.jar) > at > org.apache.cordova.CordovaInterfaceImpl.requestPermissions(CordovaInterfaceImpl.java:226) > at org.mysample.HelloWorldBridge.initDialOnce(DialOnceBridge.java:40) > at > org.mysample.HelloWorldBridge.pluginInitialize(DialOnceBridge.java:27) > at > org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:58) > at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171) > at > org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:97) > at org.apache.cordova.PluginManager.init(PluginManager.java:86) > at > org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:115) > at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:149) > at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:224) > at > com.dialonce.cordova.sample.MainActivity.onCreate(MainActivity.java:39) > at android.app.Activity.performCreate(Activity.java:6092) > at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) > at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) > at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) > at android.app.ActivityThread.access$800(ActivityThread.java:178) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) > at android.os.Handler.dispatchMessage(Handler.java:111) > at android.os.Looper.loop(Looper.java:194) > at android.app.ActivityThread.main(ActivityThread.java:5631) > 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:963) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) > {code} > h3. Investigation > According docs [Activity.requestPermissions | > https://developer.android.com/reference/android/app/Activity.html#requestPermissions(java.lang.String[], > int)] this method require Android API 23 > h3. Workaround > Wrap `requestPermissions` code with `if (Build.VERSION.SDK_INT >= > Build.VERSION_CODES.M) { ... }` -- This message was sent by Atlassian JIRA (v6.4.14#64
[jira] [Commented] (CB-13026) java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity
[ https://issues.apache.org/jira/browse/CB-13026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16097678#comment-16097678 ] jcesarmobile commented on CB-13026: --- I think a best solution should be to use Support Library's ContextCompat to check for the permissions. https://developer.android.com/training/permissions/requesting.html Anyway, all core plugins use cordova-plugin-compat for requesting permissions which handles the NoSuchMethodException, so we maybe should change documentation to tell users to use that plugin and the code PermissionHelper.requestPermissions instead of cordova.requestPermissions > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity > --- > > Key: CB-13026 > URL: https://issues.apache.org/jira/browse/CB-13026 > Project: Apache Cordova > Issue Type: Bug > Components: cordova-android >Affects Versions: cordova@7.0.0 >Reporter: Alex B. >Assignee: Joe Bowser > Labels: bug > Fix For: 7.0.0 > > > h3. The problem > Problem reproduced on Android 5.1.1 (API level 22), on all my devices which > below API level 23 > Problematic part of code > {code:java} > public class HelloWorldBridge extends CordovaPlugin { > String [] permissions = { > Manifest.permission.CALL_PHONE, > Manifest.permission.INSTALL_SHORTCUT }; > private static int REQUEST_CODE_PERMISSION = 0; > @Override protected void pluginInitialize() { > onStart(); > } > @Override public void onStart() { > cordova.requestPermissions(this, REQUEST_CODE_PERMISSION, > permissions); > } > @Override public void onNewIntent(Intent intent) { > cordova.getActivity().setIntent(intent); > } > @Override > public void onRequestPermissionResult(int requestCode, String[] > permissions, int[] grantResults) throws JSONException { > super.onRequestPermissionResult(requestCode, permissions, > grantResults); > if (requestCode == REQUEST_CODE_PERMISSION) { > for (int r : grantResults) { > if (r == PackageManager.PERMISSION_DENIED) { > return; > } > } > cordova.getActivity().runOnUiThread(new Runnable() { > @Override > public void run() { >Log.d(TAG, "Granted!"); > } > }); > } > } > } > {code} > Stack trace: > {code:java} > java.lang.NoSuchMethodError: No virtual method > requestPermissions([Ljava/lang/String;I)V in class Landroid/app/Activity; or > its super classes (declaration of 'android.app.Activity' appears in > /system/framework/framework.jar) > at > org.apache.cordova.CordovaInterfaceImpl.requestPermissions(CordovaInterfaceImpl.java:226) > at org.mysample.HelloWorldBridge.initDialOnce(DialOnceBridge.java:40) > at > org.mysample.HelloWorldBridge.pluginInitialize(DialOnceBridge.java:27) > at > org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:58) > at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:171) > at > org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:97) > at org.apache.cordova.PluginManager.init(PluginManager.java:86) > at > org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:115) > at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:149) > at org.apache.cordova.CordovaActivity.loadUrl(CordovaActivity.java:224) > at > com.dialonce.cordova.sample.MainActivity.onCreate(MainActivity.java:39) > at android.app.Activity.performCreate(Activity.java:6092) > at > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) > at > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2468) > at > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) > at android.app.ActivityThread.access$800(ActivityThread.java:178) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) > at android.os.Handler.dispatchMessage(Handler.java:111) > at android.os.Looper.loop(Looper.java:194) > at android.app.ActivityThread.main(ActivityThread.java:5631) > 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:963) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758) > {code} > h3. Investigation > According docs [Activity.requestPermissions | > https://developer.andr