Yah, the `${applicationId}.provider` value is the authority used to allow the
app access to that storage location. The authority has to match the one defined
in the [authorities
config](https://github.com/apache/cordova-plugin-camera/blob/master/plugin.xml#L65).
### Background
After a lot of investigation, I think I understand this now. The .BuildConfig
class is an Android auto generated class that
[BuildHelper.getBuildConfigValue](https://github.com/apache/cordova-plugin-compat/blob/master/src/android/BuildHelper.java#L50)
is trying to access via reflection to find the APPLICATION_ID field.
**Example BuildConfig.java that sits in
build/generated/source/buildConfig/debug/com/company/project/**
```
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.company.project;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.company.project";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "2018.1-SNAPSHOT";
}
```
We were running into the same issue where BuildHelper.getBuildConfigValue was
returning null and crashing the app, because we didn't have the `<preference
name="applicationId" value="{PACKAGE_ID}"/>` set either. This is because the
application's package name is different from the one that's ultimately built
into the APK. We updated the package name of the app, because it's a new
version of the app with new branding, but we need to submit the previous
package name in the APK so it can goto the same Google Store page.
**build.gradle**
```
android {
defaultConfig {
applicationId "com.company.oldname"
}
}
```
`Java app package: com.company.newname;`
In our example, `cordova.getActivity().getPackageName() ==
"com.company.oldname"` but the `com.company.oldname.BuildConfig` doesn't exist
(Android has created the `com.company.newname.BuildConfig`). Because
`com.company.oldname.BuildConfig` doesn't exist,
`BuildHelper.getBuildConfigValue` returns null. In most cases,
`BuildHelper.getBuildConfigValue` works fine, but this is an edge case where
this fails. This would also fail for apps with [multiple
productFlavors](http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename).
### Possible Solution
The Camera Plugin could support all three options:
- First use `preference.applicationId`.
- If null, use `BuildHelper.getBuildConfigValue`.
- If null, use `cordova.getActivity().getPackageName()` and hope it's good
enough.
I'm not sure if `cordova.getActivity().getPackageName()` will always be the
right package name because I'm not sure if the Cordova activity/context would
have the same package name as the app using it. But I think it's worth it to
try to prevent `this.applicationId` from just being null to crash later on.
Important note, `CordovaInterface.getContext()` was added in Cordova Android
7.0, so it might be better to use `cordova.getActivity()` to support previous
versions (this is important to us because we're stuck with Cordova Android
6.3.0 for the minute).
Let me know if you want me to submit a PR with these suggested changes, or if
you want to just make them in this PR.
[ Full content available at:
https://github.com/apache/cordova-plugin-camera/pull/320 ]
This message was relayed via gitbox.apache.org for [email protected]