cannot resolve method 'getSerial()' - android

i'm trying to get Serial Number in android
in this answer Thaussma said that
in Android 8 and later (>= SDK 26) use android.os.Build.getSerial()
which requires the dangerous permission READ_PHONE_STATE. Using
android.os.Build.SERIAL returns android.os.Build.UNKNOWN.
but when i tried android.os.Build.getSerial() with required permission i got cannot resolve method 'getSerial()' error

Related

Android Request Permission annotation conditional

I am building an SDK API with beacons integration which requires Bluetooth scan permission for android 12 and above. So, I added annotation for the API like this:
#RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH_SCAN])
fun enableBeaconScan()
When I add this, I am getting a warning:
Is there a way to restrict this permission only for the supported android versions and get rid of this warning?
you can use this annotation
#TargetApi(Build.VERSION_CODES.S)

Does Android app dynamically change its Target API Level

I have a Xamarin.Forms app targeting Android API Level 30 (Android 11) which had Xamarin.Twilio.AudioSwitch v1.1.3 installed. The app is available in Play Store and was working fine till the time Android 12 was not released.
As soon as Android 12 became available, I got complaints from users using the BLE functionality of the app that they are not able to connect with BLE devices supported by the application.
The Android 12 users were getting the following exception:
java.lang.SecurityException:
at android.os.Parcel.createExceptionOrNull (Parcel.java:2437)
at android.os.Parcel.createException (Parcel.java:2421)
at android.os.Parcel.readException (Parcel.java:2404)
at android.os.Parcel.readException (Parcel.java:2346)
at android.bluetooth.IBluetooth$Stub$Proxy.getRemoteName (IBluetooth.java:5470)
at android.bluetooth.BluetoothDevice.getName (BluetoothDevice.java:1889)
at crc....Adapter_Api21BleScanCallback.n_onScanResult (Native Method)
at crc....Adapter_Api21BleScanCallback.onScanResult (Adapter_Api21BleScanCallback.java:38)
at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1.run (BluetoothLeScanner.java:646)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:226)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8641)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1133)
The above exception occurs due to the Android 12 Bluetooth permission changes. But this is required only if the app targets API Level 31. But since my app targets API level 30, I was not expecting these changes to be required in my app.
On investigating the issue, I found out that the issue is due to the native Audio Switch v1.1.3 targeting Android API Level 31 (Android 12) as mentioned here: Twilio Audio Switch v1.1.3 but the Xamarin.Twilio.AudioSwitch v1.1.3 binding library specifies MonoAndroid 9.0 (https://www.nuget.org/packages/Xamarin.Twilio.AudioSwitch/1.1.3) due to which I was able to install it for a project targeting API Level 30.
Does this mean that if the app has a package which targets an Android API Level higher than the app itself, the target API level would be dynamically change to higher API level?
Now the problem that I am facing is that I am not able to get this issue fixed for the users who already have the app installed.
I did a downgrade of Xamarin.Twilio.AudioSwitch to v1.1.2 as the native Audio Switch v1.1.2 library targets Android API Level 30 (Android 11) and found that the issue gets solved for new installations of the app. If a user already using a previous version of my app which had the Audio Switch v1.1.3 package and updates to the latest version of app which is using Audio Switch 1.1.2, the user still faces the above exception.
Is there any way that this can be fixed without making the app target Android API level 31 (Android 12) as that would require significant changes to the app?
Note: Asking the users to reinstall the app is not an option for me.
--- This is only supposed to be needed if you target SDK 31 (but need legacy Bluetooth support), but its worth a try ---
Close solution.
In a text editor, edit file YourProject.Android/Properties/AndroidManifest.xml, with changes below.
Rebuild solution.
CHANGE 1:
Bluetooth permissions, point 4., recommends:
Add android:maxSdkVersion="30" to each declared Bluetooth-related permission. Example from doc's code snippet:
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
Perhaps this will clear whatever the OS is remembering re your app's Bluetooth access.
CHANGE 2 (experiments):
EITHER: REMOVE any Bluetooth permissions that were added in SDK 31. ONLY list permissions that existed in SDK 30.
OR: list the permissions app WOULD need if targeted SDK 31, but add android:maxSdkVersion="30", similar to above.
Also consider point 5.:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
maybe as:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:maxSdkVersion="30"
android:usesPermissionFlags="neverForLocation" />
What we are doing here is not standard -- "should" simply be ignored on a "target SDK 30" app -- it is an attempt to get OS to clear something it is remembering related to this app.
Hypothesis is that during OS upgrade, OS noticed which apps were using Bluetooth in a way that required additional permissions [due to Twilio.AudioSwitch v1.1.3], and marked them as needing those additional permissions. But then failing when feature used, because permission not declared in manifest.
No, it can't be changed dynamically you have to change it from gradle by yourself.

Getting error while running Screenshotter in Firebase testLab

I am trying to run Espresso tests on Android bundle uploaded to firebase testlab. I have also included the firebase Screenshotter library. I get the following errors in firebase test lab:
09-18 05:22:13.937: E/cloud_screenshotter(18993): Exception taking screenshot: java.io.FileNotFoundException: /sdcard/screenshots/com.augustinus.fcmtest.LoggedInTests-haveVideoCallScreen-CallNotification-1.jpg: open failed: ENOENT (No such file or directory)
I already have storage permissions and this shows up at the start of logs:
09-18 02:51:37.784: I/GrantPermissionCallable(18946): Permission: android.permission.READ_EXTERNAL_STORAGE is already granted!
09-18 02:51:37.785: I/GrantPermissionCallable(18946): Permission: android.permission.WRITE_EXTERNAL_STORAGE is already granted!
09-18 02:51:37.785: I/GrantPermissionCallable(18946): Permission: android.permission.READ_EXTERNAL_STORAGE is already granted!
The device used is a physical device. Pixel 4, API Level 29
UPDATE:
Have tested again and can confirm the issue exists on Api level 29 but not Api Level 28. On APi Level 29 (Android 10) there have been some changes to how accessing storage works. Accessing the shared media folders is different. Very likely Firebase ScreenShotter has not been updated to cope with API level 29.
Ideally Google Firebase needs to udpate their ScreenShotter library to work with API Level 29. As a short term solution you can add the following in your AndroidManifest.xml
<application
android:requestLegacyExternalStorage="true"

Error using getContex and ContextCompat.checkSelfPermission() after update AS

I have updated my Android Studio to 3.4.1 and Im using target sdk version 28 . I run my previous project. Now I got many errors : getContex or ContextCompat.checkSelfPermission() is not defined.
UPDATE: here is the error:
error: cannot find symbol method getContext()
error: cannot find symbol method shouldShowRequestPermissionRationale(MainActivity,String)
How can I fix it?
ContextCompat.checkSelfPermission(Context context, String permission) method is used simply for checking whether you are having requested permission available for your app or not.
If your app needs a dangerous permission, you must check whether you have that permission every time you perform an operation that requires that permission. Beginning with Android 6.0 (API level 23), users can revoke permissions from any app at any time, even if the app targets a lower API level.
ActivityCompat.requestPermissions(Activity activity, String[] permissions,int reqCode) method is used for requesting permissions
Thanks for all answers.I add implementation 'com.android.support:support-v4:28.0.0' to build.gradle. Before it I just have implementation 'com.android.support:appcompat-v7:28.0.0' and It works.

Looking for a list of methods that cause Android API 23 (Marshmallow) to throw the permission needed SecurityException

Has the Android team posted a list of methods that cause Android API 23 (Marshmallow) to throw a SecurityException when a permission is needed?
Something like:
RECORD_AUDIO throws SecurityException on the following methods:
SpeechRecognizer.startListening
etc.
As of now, we're just wandering around our app trying to best-guess when this will happen. Some devices are throwing this exception when others aren't -- as well as the emulator.
EDIT:
Issue solved. This is a problem with Xamarin Studio as it does not flag function calls that need a permissions check. I recently created a project in Android Studio and it red-underlines function calls that need a permissions check.

Categories

Resources