Codename One Preferences/Storage permissions - codenameone

I have developed and published an app in Google Play Store, which only send simple String request to REST API and store the results in the Preferences. The same app is also submitted to Windows Store for publication, however it was rejected due to the following reason:
The app declares use of the sensitive capability [musicLibrary, picturesLibrary, videosLibrary] without appearing to access the declared capability. Please removed the sensitive capability declaration and re-submit the app.
Upon inspection to Google Play Store submission, I noticed the same permissions are requested:
This app has access to:Photos/Media/Filesread the contents of your USB storagemodify or delete the contents of your USB storageStorageread the contents of your USB storagemodify or delete the contents of your USB storageOtherreceive data from Internetview network connectionsfull network accessprevent device from sleeping
So my question is, do Preferences really need these permissions, or can I set some kind of build hints to remove these permission requests, especially for UWP build? I have also tried to set android.blockExternalStoragePermission build hint, but the permissions are still requested in Android build. I have yet to try iOS build since currently I don't have Apple Developer account.
Thank you very much in advance.
Edit #1 (23/10/2018):
Upon further inspection, I found that I have mistakenly uploaded the version that didn't declare android.blockExternalStoragePermission to Google Play Store, so all good on Android version.
Currently I'm not using any of cn1libs, and here's the list of all classes imported in my application:
java.util.HashMapjava.util.Mapjava.util.Randomcom.codename1.components.InfiniteProgresscom.codename1.components.ToastBarcom.codename1.components.ToastBar.Statuscom.codename1.io.CharArrayReadercom.codename1.io.JSONParsercom.codename1.io.Logcom.codename1.io.NetworkManagercom.codename1.io.Preferencescom.codename1.io.rest.Responsecom.codename1.io.rest.Restcom.codename1.l10n.L10NManagercom.codename1.ui.Buttoncom.codename1.ui.Componentcom.codename1.ui.Containercom.codename1.ui.Dialogcom.codename1.ui.FontImagecom.codename1.ui.Formcom.codename1.ui.Labelcom.codename1.ui.events.ActionEventcom.codename1.ui.events.ActionListenercom.codename1.ui.layouts.BorderLayoutcom.codename1.ui.layouts.FlowLayoutcom.codename1.ui.layouts.GridLayoutcom.codename1.ui.plaf.Bordercom.codename1.ui.plaf.Stylecom.codename1.ui.plaf.UIManagercom.codename1.ui.util.Resources
So my original question remain, how do I set the build hints to prevent the same external storage read/write permission in Windows and iOS?

See the section titled "Android Permissions" here, for a list of some API's that might trigger extra permissions. I suggest extracting the manifest from the XML and inspecting it. It should include two permissions based on your description you should have two permissions there:
android.permission.WRITE_EXTERNAL_STORAGE - which you should have been disabled when you applied android.blockExternalStoragePermission
android.permission.INTERNET - this one you actually need
I'm assuming you have a permission for media access and here it becomes a question of where it came from?
Did you use a cn1lib that might include a feature that triggers this?
Do you have a feature in the app that isn't active yet?
Once you have the specific name or results of this investigation comment here and I'll revise the answer with more details.

Related

We have detected that your app contains the Request Legacy External Storage tag in the manifest file for one or more app or APK packages

We have detected that your app contains the Request Legacy External Storage tag in the manifest file for one or more app or APK packages.
Developers who have apps on devices running Android OS 11 or later should use the Subsidiary Storage feature to give users better control over accessing the storage space available on their device. To launch your app on Android OS 11 or later after May 5, you need to perform one of the following steps:
Update your app to use privacy best practices such as Storage Access Framework or Media Store API
Update your app to announce the permission to access all files (MANAGE_EXTERNAL_STORAGE) in the manifest file, and to complete the statement of access permission to all files in the Play Console as of May 5
Completely remove the permission to access all files from your app
For apps targeting Android 11, the request Legacy External Storage tag will be ignored. You have to use the access permission to all files to retain access to external storage space.
Applications that require access to all files without permission to use will be removed from Google Play, and you will not be able to publish updates.
I want someone to help me
if your targetSdk is not 30 you can keep using that flag
android:requestLegacyExternalStorage="true"
And you don' t have to do anything.
But developers should do targetSdk = 30 in November.
I share answer which came from google:
"you can continue to use requestLegacyExternalStorage after May 5th since you are not targeting Android 11. You do not need to do anything before May 5th."
In our application targetSdk = 29 and we use requestLegacyExternalStorage. If you are in the same condition, you don' t have to do anything for now.
If in your application targetSDK = 30 you have two option:
if your application is need access all files in device, use MANAGE_EXTERNAL_STORAGE. But you should submit a form for this permission.
Or you can use Storage access framework or the MediaStore API to handle your file access features.

Admob is not showing ads on real device after build. Expo React-native

Expo SDK Version: 36.0.0
Platforms(Android/iOS/web/all): Android
I use the expo Admob lib to implement AdMob banners and interstitial Ads on my App. When running through expo cli on my emulator it works perfectly. When I use real adUnitID it shows a real ad. However, after building the apk file and installing on real devices, the Ads are not showing anymore.
My implementation is quite simple:
<AdMobBanner
bannerSize="mediumRectangle"
adUnitID={'ca-app-pub-my-key/my-key'}
onAdViewDidReceiveAd={() => adReceived('success')}
onDidFailToReceiveAdWithError={() => adReceived('err')}
/>
adReceived(arg) - it’s just a logger, which save results, do I have success request to Google ad server or not.
On real device I have err messages. So, it looks like then app doesn’t have permission to making request to the internet.
I don’t have permission section in my app.json, and any other specific setting in this file. According to Configuration with app.json page - To use ALL permissions supported by Expo, do not specify the "permissions" key.
I found on stackoverflow and expo-forum a lot of relevant topics. And no one provided any working solution.
If I should provide some additional information, please specify what I need to add.
If there is a solution to this, which I didn’t find then please add the link.
Let’s help to resolve this question once and forever for all developers.
Thanks!
According to this post, there are six reasons. But probably, you did not update your payment details or your region has a slower fill-rate. Slower fill-rate means, there are less advertisers targeting these markets (in your region or language).
how I fixed the problem
first of all - you can add an argument with error
onDidFailToReceiveAdWithError={(errorCode) => console.log(errorCode)}
secondly
When I added my apps to the Google Play store and install it from the store, then my app start showing Ad correctly

After configuring a Manifest for an App Registration in AzureAD, I am unable to save the Manifest

I am an owner of an App Registration in AzureAD. The SAVE button is greyed out when I try to save the manifest. I am able to get an error if I upload the manifest. The error is generic, "Failed to save manifest." I am looking for a troubleshooting path. I will not turn down solutions either.
I've added myself as an Application Administrator, but it didn't work.
It depends on what you modified.
Please double-check the content comparison before and after the modification to locate the properties that may be problematic.
When you try to upload a previously downloaded manifest, you may see the above error. This is likely because the manifest editor now supports a newer version of the schema, which doesn't match with the one you're trying to upload. We recommend try the following.
1.Edit the attributes individually in the manifest editor instead of uploading a previously downloaded manifest. Use the manifest reference table to understand the syntax and semantics of old and new attributes so that you can successfully edit the attributes you're interested in.
2.If your workflow requires you to save the manifests in your source repository for use later, we suggest rebasing the saved manifests in your repository with the one you see in the App registrations experience.
Here is a similar SO thread you could refer to.

Recover Cloud functions default service account with the undelete POST call

I have used Google Cloud Functions for quite a long time, with no real authentication problem for now.
Today I meet this error while deploying a new function
ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Bad Request], message=[Default service account 'PROJECT-ID#appspot.gserviceaccount.com' doesn't exist. Please recreate this account (for example by disabling and enabling the Cloud Functions API), or specify a different account.]
I tried several things :
disable/enable GCF API : no service account recovered
gcloud beta app repair reference here
No default service account recovered
the undelete API POST call
If I understand well the current GCP features, using the last option is my best solution, but somehow I keep getting a 400 error
I found my unique-id in my log activity at the creation of the default service account
I really can't see where is the problem in the undelete API call and would be really thankful if you could help with it
Thanks to #Maxim, I know now that my problem comes from the fact that the deleting of this service account happened more than 30 days ago. Which means that it has already been purged from the system and it's not recoverable anymore.
In case you meet this same kind of problem, please try out this link :
https://cloud.google.com/iam/docs/creating-managing-service-accounts#undeleting_a_service_account
I see three alternative ways in how to proceed here next:
Create a new project from scratch to work from.
File a support case via the support center.
Open a private issue by providing your project number in the following component.
I believe it's convenient in reaching out GCP Support for help at this stage, and recommend you to do so; seeing as you've attempted most if not all ways of Service Account recovery to no success.
On a last note, as for the latter option, the contents of the private issue will only be visible to you, and to the GCP Support staff (us). If you choose this option, please let me know when it's opened, and I'll start working on it as soon as possible.

Access Sitecore DB from API in Console application

I would like to accesss the sitecore DB and items from console application like
Sitecore.Data.Database db = Sitecore.Context.Database
or
Sitecore.Data.Database db = Sitecore.Data.Database.GetDatabase("master")
how do I configure and setup my console application to access the DB as above?
Thanks Everyone for the suggestion, I am really interested in config changes, I used webservice, but it has very limited methods. For example, if I would like create an Item with the template and insert the item with prepopulated value, there is no such option. The reason I am looking for the console apporach is I would like to import the contents from XML or excel sheet and push those to the sitecore tree, eventually use the scheduled task to run the console app periodically. I do not want to copy the entire web.config and app_config. If anyone has already done this, could you please post your steps and necessary config changes?
You have two options I think:
1) Import the Sitecore bits of a website's web.config into your console application's app.config, so that the Sitecore API "just works"
I'm sure I read a blog post about this, but I can't find the reference right now. (I will have another look) But I think the simple but long winded approach is to copy all of the <sitecore/> element and all the separate files it references. I'm fairly sure you can whittle this down to a subset of the config required for data access with a bit of thinking.
2) Don't use the Sitecore API directly, connect to a web service that exposes access to it remotely.
There are a few of these that already exist. Sitecore itself exposes one, Sitecore Rocks has one, and Hedgehog TDS has one too. And you can always write your own (since any web service running inside the Sitecore ASP.Net app can make database calls and report values back and forth - just remember to consider security if this web service might end up exposed externally for any reason)
John West links to some relevant stuff here:
http://www.sitecore.net/Learn/Blogs/Technical-Blogs/John-West-Sitecore-Blog/Posts/2013/09/Getting-Data-Out-of-the-Sitecore-ASPNET-CMS.aspx
-- Edited to add --
I've not found the blog post I remember. But I came across this SO thread:
Accessing Sitecore API from a CLI tool
which refers to this blog post:
http://www.experimentsincode.com/?p=232
which I think gives the info you'll need for option 1.
(And it reminds me that, of course, when you copy the config stuff you have to copy the Sitecore binaries into your app's folder as well)
I would just like to expand on #JermDavis' post and note that Sitecore isn't a big fan of being accessed when not in a web application. However, if you still want to do this, you will need to make sure that you have all of the necessary configuration settings from the web.config and App_Config of your site in your console application's app.config file.
Moreover, you will never be able to call Sitecore.Context in a console application, as the Sitecore Context sits on top of the HttpContext which means that it must be an application and have a valid request for you to use it. What you are looking for is something more along the lines of Sitecore.Configuration.Factory.GetDatabase("master").
Good luck and happy coding :)
This sounds like a job for the Sitecore Item Web API. I use the Sitecore Item Web API whenever I need to access Sitecore data from the master database outside the context of the Content Management server or outside of the context of the Sitecore application. The Web API definitely does not allow you to do everything that the standard Sitecore API does but it can act as a good base and I now extend upon the Web API instead of writing my own custom web services whenever possible.
Thanks to JemDavis's advise.
After I copied the configuration and made changes to config section to get rid of conflicts. I copied almost all of Sitrecore, analytics and lucene dlls, it worked great.
Only thing you have to remember is, copy the app_config folder to the same location where your dlls are.
Thanks again JemDavis....

Resources