PhoneGap - 使 Android 功能可选
PhoneGap - Make Android feature optional
我想为我的 android 应用程序设置一些不需要的设置,这样 Google' Play 商店会识别它对平板电脑也很有用。
我需要将这两行添加到我的 AndroidManifest.xml:
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
因为我使用 PhoneGap 构建来编译我的应用程序,所以我需要以某种方式将它们添加到 config.xml 文件中,因此 PhoneGap 会在构建期间将它们添加到正确的位置过程(我猜)......但没有成功!我需要使用任何特定语法来通过 config.xml 文件添加 uses-feature 吗?
请注意,我通过将下面的行添加到我的 config.xml 文件中来设置 minSdkVersion,并在之后做了几乎相同的事情构建我的清单文件中有它:
<preference name="android-minSdkVersion" value="11" />
找到解决方案!基于 PhoneGap Documentation - Config File Elements,只需要在我的 'config.xml' 文件中添加如下内容:
<gap:config-file platform="android" parent="/manifest" mode="add">
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
</gap:config-file>
将 gap 命名空间添加到 widget 节点,也是需要的:
xmlns:gap="http://phonegap.com/ns/1.0"
<config-file>
看起来对于覆盖非常有用....唉,这似乎是 PhoneGap 独有的功能。对于 Cordova,您可能需要使用钩子。
可以找到一个很好的例子HERE
我修改了脚本以添加我需要的功能(我需要 GPS 和相机作为可选功能)。
module.exports = function (context) {
var fs = context.requireCordovaModule('fs'),
path = context.requireCordovaModule('path');
var platformRoot = path.join(context.opts.projectRoot, 'platforms/android');
var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');
if (fs.existsSync(manifestFile)) {
fs.readFile(manifestFile, 'utf8', function (err, data) {
if (err) {
throw new Error('Unable to find AndroidManifest.xml: ' + err);
}
var insertAt = data.indexOf("</manifest>");
var optionalFeatures = "<uses-feature android:name=\"android.hardware.LOCATION\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.location.GPS\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.camera\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.camera.autofocus\" android:required=\"false\"/>";
var result = data.slice(0, insertAt) + optionalFeatures + data.slice(insertAt);
fs.writeFile(manifestFile, result, 'utf8', function (err) {
if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err);
})
});
}
};
然后在config.xml
中设置钩子
<hook type="after_build" src="scripts/afterBuild.js" />
希望对您有所帮助
我想为我的 android 应用程序设置一些不需要的设置,这样 Google' Play 商店会识别它对平板电脑也很有用。 我需要将这两行添加到我的 AndroidManifest.xml:
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
因为我使用 PhoneGap 构建来编译我的应用程序,所以我需要以某种方式将它们添加到 config.xml 文件中,因此 PhoneGap 会在构建期间将它们添加到正确的位置过程(我猜)......但没有成功!我需要使用任何特定语法来通过 config.xml 文件添加 uses-feature 吗?
请注意,我通过将下面的行添加到我的 config.xml 文件中来设置 minSdkVersion,并在之后做了几乎相同的事情构建我的清单文件中有它:
<preference name="android-minSdkVersion" value="11" />
找到解决方案!基于 PhoneGap Documentation - Config File Elements,只需要在我的 'config.xml' 文件中添加如下内容:
<gap:config-file platform="android" parent="/manifest" mode="add">
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
</gap:config-file>
将 gap 命名空间添加到 widget 节点,也是需要的:
xmlns:gap="http://phonegap.com/ns/1.0"
<config-file>
看起来对于覆盖非常有用....唉,这似乎是 PhoneGap 独有的功能。对于 Cordova,您可能需要使用钩子。
可以找到一个很好的例子HERE
我修改了脚本以添加我需要的功能(我需要 GPS 和相机作为可选功能)。
module.exports = function (context) {
var fs = context.requireCordovaModule('fs'),
path = context.requireCordovaModule('path');
var platformRoot = path.join(context.opts.projectRoot, 'platforms/android');
var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');
if (fs.existsSync(manifestFile)) {
fs.readFile(manifestFile, 'utf8', function (err, data) {
if (err) {
throw new Error('Unable to find AndroidManifest.xml: ' + err);
}
var insertAt = data.indexOf("</manifest>");
var optionalFeatures = "<uses-feature android:name=\"android.hardware.LOCATION\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.location.GPS\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.camera\" android:required=\"false\"/><uses-feature android:name=\"android.hardware.camera.autofocus\" android:required=\"false\"/>";
var result = data.slice(0, insertAt) + optionalFeatures + data.slice(insertAt);
fs.writeFile(manifestFile, result, 'utf8', function (err) {
if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err);
})
});
}
};
然后在config.xml
中设置钩子 <hook type="after_build" src="scripts/afterBuild.js" />
希望对您有所帮助