【问题标题】:Ionic 2: copying resources to android platformIonic 2:将资源复制到android平台
【发布时间】:2018-04-22 20:28:00
【问题描述】:

我添加了一些我只想添加到 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" />

但是我似乎无法复制它。我需要运行什么才能复制资源?

【问题讨论】:

  • 这张图片是在应用中使用的吗?通常所有的应用资产都在assets/imgs。如果您只需要在一种配置中使用它,那么您可能需要将副本附加到 npm 而不是 config.xml。只是一个想法
  • @PhilipBrack 此图像用于推送通知。复制到 npm 是什么意思?
  • 我习惯于在 npm 脚本中添加自定义行为。这就是我的意思。也许this会对你有所帮助。

标签: cordova ionic-framework ionic2 phonegap-plugins


【解决方案1】:

对于遇到此问题的任何人,这是我最终使用的解决方案。

  1. 创建一个名为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;
    }
    
  2. 将它放在你的项目根目录中的一个文件夹中(在我的例子中,我称之为 package_hooks 并从你的 config.xml 中引用它

    <hook src="package_hooks/android_custom_resources.js" type="after_prepare" />
    

此脚本假定在您的&lt;project root&gt;/resources/android/custom 目录中,文件放置在与您希望将它们复制到的文件夹名称相同的文件夹中。例如,如果我有一个文件&lt;my project&gt;/resources/android/custom/drawable-xxhdpi/myfile.png,它将被复制到: &lt;my project&gt;/platforms/android/res/drawable-xxhdpi/myfile.png

如果您在 /custom 目录本身中有文件,它肯定会中断,但否则它为我完成了这项工作,我希望它可以帮助其他寻找临时解决方案的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多