@capacitor/filesystem更改downloadfile支持本地文件下载

ionic监听外部程序:

 android下需要在AndroidManifest.xml添加内容(具体参考ionic native的APP插件),配置例如:

 <intent-filter tools:ignore="AppLinkUrlError">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:mimeType="*/*" />
          </intent-filter>

ionic打开文件时的代码如下:

import { App } from '@capacitor/app';


App.addListener('appUrlOpen', (event) => {      
      const url = event.url;//android下url格式:content://com.android.fileexplorer.myprovider/external_files/test.txt
//拷贝url到Data目录下,用copy方式出错
//   Filesystem.copy({ from: readurl, to: 'test.txt', toDirectory: Directory.Data }).then(
      //     (v) => {
      //       this.files.push('copy:' + v.uri);
      //     }
      //   ).catch(
      //     (err) => {
      //       this.files.push('copy_error:' + err);
      //     }
      //   );
     });
//Filesystem.readFile可以读出内容,但是为字符串,用Filesystem.writeFile也只能写字符串,对于非文本文件无法操作

为了实现拷贝,更改代码,通过downloadFile函数来实现,主要就是读取文件流,然后写入。

android下:

用@capacitor/filesystem的copy函数时,如果拷贝为content://...的文件,会报错,copy不支持content://路径的文件。

修改downloadFile函数,支持本地文件(content://)的下载。

修改capacitor-filesystem的android代码下的Filesystem文件下的downloadFile函数,如下图:

更改后代码如下:

public JSObject downloadFile(PluginCall call, Bridge bridge, HttpRequestHandler.ProgressEmitter emitter)
        throws IOException, URISyntaxException, JSONException {
        String urlString = call.getString("url", "");
        JSObject headers = call.getObject("headers", new JSObject());
        JSObject params = call.getObject("params", new JSObject());
        Integer connectTimeout = call.getInt("connectTimeout");
        Integer readTimeout = call.getInt("readTimeout");
        Boolean disableRedirects = call.getBoolean("disableRedirects");
        Boolean shouldEncode = call.getBoolean("shouldEncodeUrlParams", true);
        Boolean progress = call.getBoolean("progress", false);

        String method = call.getString("method", "GET").toUpperCase(Locale.ROOT);
        String path = call.getString("path");
        String directory = call.getString("directory", Environment.DIRECTORY_DOWNLOADS);


        final File file = getFileObject(path, directory);
        InputStream connectionInputStream = null;
        String contentLength = null;
        try {
          connectionInputStream = getInputStream(urlString,null);
          contentLength = "1024";
        } catch (Exception e){}
        if (connectionInputStream == null) {
          final URL url = new URL(urlString);
          HttpRequestHandler.HttpURLConnectionBuilder connectionBuilder = new HttpRequestHandler.HttpURLConnectionBuilder()
            .setUrl(url)
            .setMethod(method)
            .setHeaders(headers)
            .setUrlParams(params, shouldEncode)
            .setConnectTimeout(connectTimeout)
            .setReadTimeout(readTimeout)
            .setDisableRedirects(disableRedirects)
            .openConnection();

          CapacitorHttpUrlConnection connection = connectionBuilder.build();

          connection.setSSLSocketFactory(bridge);

          connectionInputStream = connection.getInputStream();
          contentLength = connection.getHeaderField("content-length");
        }

          FileOutputStream fileOutputStream = new FileOutputStream(file, false);


          int bytes = 0;
          int maxBytes = 0;

        try {
            maxBytes = contentLength != null ? Integer.parseInt(contentLength) : 0;
        } catch (NumberFormatException ignored) {}

        byte[] buffer = new byte[1024];
        int len;

        // Throttle emitter to 100ms so it doesn't slow down app
        long lastEmitTime = System.currentTimeMillis();
        long minEmitIntervalMillis = 100;

        while ((len = connectionInputStream.read(buffer)) > 0) {
            fileOutputStream.write(buffer, 0, len);

            bytes += len;

            if (progress && null != emitter) {
                long currentTime = System.currentTimeMillis();
                if (currentTime - lastEmitTime > minEmitIntervalMillis) {
                    emitter.emit(bytes, maxBytes);
                    lastEmitTime = currentTime;
                }
            }
        }

        if (progress && null != emitter) {
            emitter.emit(bytes, maxBytes);
        }

        connectionInputStream.close();
        fileOutputStream.close();

        return new JSObject() {
            {
                put("path", file.getAbsolutePath());
            }
        };
    }

主要更改部分:

 更改后,就可以调用downloadfile下载本地文件(拷贝)了,如下所示:

Filesystem.downloadFile(
        {
          url: "content://com.android.fileexplorer.myprovider/external_files/test.txt",
          path: "text.txt",
          directory: Directory.Data,
          progress: true
        }
      )
      .then(
        (v) => {
          this.files.push('copy:' + v.path);
        }
      ).catch(
        (err) => {
          this.files.push('copy_error:' + err);
        }
      );

Share插件访问Data文件夹,需要增加权限,参考官网:

By default, Capacitor apps only allow to share files from caches folder. To make other Android folders shareable, they have to be added in android/app/src/main/res/xml/file_paths.xml file. Check the Specifying Available Files section in FileProvider docs for the available locations.

增加后如下( android/app/src/main/res/xml/file_paths.xml):

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="." />
    <cache-path name="my_cache_images" path="." />   
    <external-files-path
        name="external-files-path"
        path="."></external-files-path>
    <files-path
        name="files-path"
        path="."></files-path>
</paths>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网页开发中,capacitor 是一个常用的跨平台框架,用于创建混合应用程序。它结合了Web技术和原生API,使开发人员能够创建原生应用程序的用户界面,并使用像摄像头、文件系统和传感器等设备的原生功能。 在 capacitor 中,页面跳转是一种常见的操作,可以通过编写代码来实现。具体步骤如下: 1. 首先,我们需要安装 capacitor,可以使用 npm 进行安装,命令为:npm install @capacitor/core @capacitor/cli 2. 安装完毕之后,我们需要初始化 capacitor,可以使用以下命令:npx cap init 3. 初始化成功后,我们可以开始创建页面了。可以使用以下命令创建新页面:npx cap generate 4. 创建完页面后,我们需要在代码中定义页面跳转的逻辑。在 capacitor 中,可以使用NavController来实现页面导航。例如,可以使用以下代码进行页面跳转: ```javascript import { NavController } from '@ionic/angular'; constructor(public navCtrl: NavController) {} goToPage(pageName: string) { this.navCtrl.navigateForward(pageName); } ``` 这样,当我们调用 goToPage 方法时,页面将会跳转到指定的页面。 除此之外,capacitor支持带参数的页面跳转。我们可以在调用 navigateForward 方法时传入参数来实现。例如: ```javascript goToPage(pageName: string, param: any) { this.navCtrl.navigateForward(pageName, { queryParams: { data: param } }); } ``` 通过这种方式,我们可以在跳转的页面中获取到传递的参数。 总结而言,capacitor 提供了丰富的API来实现页面跳转的功能,开发者可以根据具体需求使用 NavController 来完成页面的跳转导航。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值