Ionic 2:将资源复制到 android 平台
Ionic 2: copying resources to android platform
我添加了一些我想添加到 android 平台的图像。
我在 config.xml
中的 <platform name="android">
下添加了以下行:
<resource-file src="resources/android/ic_stat_push_android/drawable-hdpi.png" target="platforms/android/res/drawable-hdpi/ic_stat_push_android.png" />
但是我似乎无法复制它。要复制资源,我需要 运行 什么?
对于遇到此问题的任何人,这是我最终使用的解决方案。
创建一个名为 android_custom_resources.js
:
的文件
var fs = require('fs');
var path = require('path');
var sourceDir = 'resources/android/custom';
var platformDir = 'platforms/android';
var resourceDirs = [
'res/drawable-ldpi',
'res/drawable-mdpi',
'res/drawable-mdpi-v11',
'res/drawable-hdpi',
'res/drawable-hdpi-v11',
'res/drawable-xhdpi',
'res/drawable-xhdpi-v11',
'res/drawable-xxhdpi',
'res/drawable-xxhdpi-v11',
'res/drawable-xxxhdpi',
'res/drawable-xxxhdpi-v11'
];
module.exports = function(ctx) {
if (ctx.opts.platforms.indexOf('android') < 0) {
return;
}
var Q = ctx.requireCordovaModule('q');
var deferred = Q.defer();
var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir);
var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir);
function copy(src, dest) {
var deferred = Q.defer();
fs.stat(src, function(err, stats) {
if (err || !stats.isFile()) {
return deferred.reject(err);
}
fs.stat(path.dirname(dest), function(err, stats) {
if (err || !stats.isDirectory()) {
return deferred.reject(err);
}
var rs = fs.createReadStream(src);
rs.on('error', function(err) {
console.error(err.stack);
deferred.reject(err);
});
var ws = fs.createWriteStream(dest);
ws.on('error', function(err) {
console.error(err.stack);
deferred.reject(err);
});
ws.on('close', function() {
deferred.resolve();
});
rs.pipe(ws);
});
});
return deferred.promise;
}
fs.stat(customResourcesDir, function(err, stats) {
if (err || !stats.isDirectory()) {
return deferred.resolve();
}
fs.readdir(customResourcesDir, function(err, files) {
var copies = [];
for (var i in files) {
var innerDir = path.join(customResourcesDir, files[i]);
var innerFiles = fs.readdirSync(innerDir);
for (var k in innerFiles){
var innerFilePath = path.join(innerDir, innerFiles[k]);
var innerDestPath = path.join(androidPlatformDir, 'res', files[i], innerFiles[k]);
copies.push([innerFilePath, innerDestPath]);
}
}
copies.map(function(args) {
return copy.apply(copy, args);
});
Q.all(copies).then(function(r) {
deferred.resolve();
}, function(err) {
console.error(err.stack);
deferred.reject(err);
});
});
});
return deferred.promise;
}
将它放在项目根目录中的一个文件夹中(在我的例子中,我将其命名为 package_hooks
并从你的 config.xml
中引用它
<hook src="package_hooks/android_custom_resources.js" type="after_prepare" />
此脚本假定在您的 <project root>/resources/android/custom
目录中,文件放置在与您希望将它们复制到的文件夹同名的文件夹中。例如,如果我有一个文件<my project>/resources/android/custom/drawable-xxhdpi/myfile.png
,它将被复制到:
<my project>/platforms/android/res/drawable-xxhdpi/myfile.png
如果 /custom 目录本身有文件,它肯定会崩溃,但除此之外它为我完成了工作,我希望它能帮助其他寻找临时解决方案的人。
我添加了一些我想添加到 android 平台的图像。
我在 config.xml
中的 <platform name="android">
下添加了以下行:
<resource-file src="resources/android/ic_stat_push_android/drawable-hdpi.png" target="platforms/android/res/drawable-hdpi/ic_stat_push_android.png" />
但是我似乎无法复制它。要复制资源,我需要 运行 什么?
对于遇到此问题的任何人,这是我最终使用的解决方案。
创建一个名为
的文件android_custom_resources.js
:var fs = require('fs'); var path = require('path'); var sourceDir = 'resources/android/custom'; var platformDir = 'platforms/android'; var resourceDirs = [ 'res/drawable-ldpi', 'res/drawable-mdpi', 'res/drawable-mdpi-v11', 'res/drawable-hdpi', 'res/drawable-hdpi-v11', 'res/drawable-xhdpi', 'res/drawable-xhdpi-v11', 'res/drawable-xxhdpi', 'res/drawable-xxhdpi-v11', 'res/drawable-xxxhdpi', 'res/drawable-xxxhdpi-v11' ]; module.exports = function(ctx) { if (ctx.opts.platforms.indexOf('android') < 0) { return; } var Q = ctx.requireCordovaModule('q'); var deferred = Q.defer(); var androidPlatformDir = path.join(ctx.opts.projectRoot, platformDir); var customResourcesDir = path.join(ctx.opts.projectRoot, sourceDir); function copy(src, dest) { var deferred = Q.defer(); fs.stat(src, function(err, stats) { if (err || !stats.isFile()) { return deferred.reject(err); } fs.stat(path.dirname(dest), function(err, stats) { if (err || !stats.isDirectory()) { return deferred.reject(err); } var rs = fs.createReadStream(src); rs.on('error', function(err) { console.error(err.stack); deferred.reject(err); }); var ws = fs.createWriteStream(dest); ws.on('error', function(err) { console.error(err.stack); deferred.reject(err); }); ws.on('close', function() { deferred.resolve(); }); rs.pipe(ws); }); }); return deferred.promise; } fs.stat(customResourcesDir, function(err, stats) { if (err || !stats.isDirectory()) { return deferred.resolve(); } fs.readdir(customResourcesDir, function(err, files) { var copies = []; for (var i in files) { var innerDir = path.join(customResourcesDir, files[i]); var innerFiles = fs.readdirSync(innerDir); for (var k in innerFiles){ var innerFilePath = path.join(innerDir, innerFiles[k]); var innerDestPath = path.join(androidPlatformDir, 'res', files[i], innerFiles[k]); copies.push([innerFilePath, innerDestPath]); } } copies.map(function(args) { return copy.apply(copy, args); }); Q.all(copies).then(function(r) { deferred.resolve(); }, function(err) { console.error(err.stack); deferred.reject(err); }); }); }); return deferred.promise; }
将它放在项目根目录中的一个文件夹中(在我的例子中,我将其命名为
中引用它package_hooks
并从你的config.xml
<hook src="package_hooks/android_custom_resources.js" type="after_prepare" />
此脚本假定在您的 <project root>/resources/android/custom
目录中,文件放置在与您希望将它们复制到的文件夹同名的文件夹中。例如,如果我有一个文件<my project>/resources/android/custom/drawable-xxhdpi/myfile.png
,它将被复制到:
<my project>/platforms/android/res/drawable-xxhdpi/myfile.png
如果 /custom 目录本身有文件,它肯定会崩溃,但除此之外它为我完成了工作,我希望它能帮助其他寻找临时解决方案的人。