首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android上运行时,本机PhotoLibrary在SaveImage上崩溃。

在Android上运行时,本机PhotoLibrary在SaveImage上崩溃。
EN

Stack Overflow用户
提问于 2022-03-09 21:23:00
回答 1查看 132关注 0票数 1

我试图做一些非常简单的事情,但它却给我带来了很多痛苦。

我有一个Ionic v5角12应用程序,并安装了Ionic-本地/PhotoLibrary插件。

https://ionicframework.com/docs/v5/native/photo-library

按照插件本身的建议,我使用的是Ionic-本地版本。

https://github.com/terikon/cordova-plugin-photo-library

这是我的密码

代码语言:javascript
复制
import { PhotoLibrary } from '@ionic-native/photo-library/ngx';


constructor(private photoLibrary: PhotoLibrary) { }

const blob = new Blob(binaryData, { type: dataType });
this.file.writeFile(this.file.dataDirectory, attachment.name, blob, { replace: true }).then(() => {
     console.log('file should be saved');
     let libraryItem = this.photoLibrary.saveImage(this.file.dataDirectory + attachment.name, "RaceApp");   
     console.log('photo should be saved to album');    
});

在android中运行时,我在控制台中看到以下内容

代码语言:javascript
复制
I/Capacitor/Console: File: https://localhost/main.js - Line 3687 - Msg: file should be saved
D/MediaScannerConnection: Scanned /storage/emulated/0/Pictures/RaceApp/2022-2-9-6.jpeg to content://media/external_primary/images/media/9512

E/AndroidRuntime: FATAL EXCEPTION: android.bg
    Process: com.pyrix.racechat, PID: 10114
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.toString()' on a null object reference
        at org.apache.cordova.PluginResult.<init>(PluginResult.java:55)
        at org.apache.cordova.CallbackContext.success(CallbackContext.java:70)
        at com.terikon.cordova.photolibrary.PhotoLibrary$5$1.run(PhotoLibrary.java:212)
        at com.terikon.cordova.photolibrary.PhotoLibraryService$2.run(PhotoLibraryService.java:214)
        at com.terikon.cordova.photolibrary.PhotoLibraryService$5.onScanCompleted(PhotoLibraryService.java:579)
        at android.media.MediaScannerConnection.runCallBack(MediaScannerConnection.java:211)
        at android.media.MediaScannerConnection.lambda$scanFile$1(MediaScannerConnection.java:188)
        at android.media.MediaScannerConnection$$ExternalSyntheticLambda0.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.os.HandlerThread.run(HandlerThread.java:67)

我确实看到,RaceApp相册已经创建,并将照片保存到该相册。我不明白的是,为什么应用程序崩溃了,并且显示了错误。

EN

回答 1

Stack Overflow用户

发布于 2022-11-23 06:50:17

以下是将base64图像存储到文件/照片库的另一种方法。在我的例子中,我已经在Ionic 5,cordova 11和角12上测试过它,它工作得很好。

插件使用

ionic cordova plugin add cordova-plugin-photo-library --force

npm install @awesome-cordova-plugins/photo-library@6

代码语言:javascript
复制
 saveFile(base64Data) {
    let UUID = 'IMAGE_NAME_' + (new Date().getTime()).toString(16);
    let realData = base64Data.split(",")[1];
    let blob = this.b64toBlob(realData, 'image/jpeg');
    this.file.checkDir(this.file.externalRootDirectory, 'DCIM').then(result => {
      console.log('Directory exists: ' + JSON.stringify(result));
      this.file.writeFile(this.file.externalRootDirectory + 'DCIM/', UUID + '.jpg', blob).then(res => {
        console.log('File created success: ' + JSON.stringify(res));
      }).catch(err => {
        console.log('File created failed: ' + JSON.stringify(err));
      });
    }).catch(err => {
      console.log('Directory not exists: ' + JSON.stringify(err));
      this.file.createDir(this.file.externalRootDirectory, 'DCIM', false).then(result => {
        console.log('Directory created Success: ' + JSON.stringify(result));
        this.file.writeFile(this.file.externalRootDirectory + 'DCIM/', UUID + '.jpg', blob).then(res => {
          console.log('File created success: ' + JSON.stringify(res));
        }).catch(err => {
          console.log('File created failed: ' + JSON.stringify(err));
        });
      }).catch(err => {
        console.log('Directory created Failed: ' + JSON.stringify(err));
      });
    });
  }
  b64toBlob(b64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 512;
    var byteCharacters = atob(b64Data);
    var byteArrays = [];

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
      var slice = byteCharacters.slice(offset, offset + sliceSize);

      var byteNumbers = new Array(slice.length);
      for (var i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
      }

      var byteArray = new Uint8Array(byteNumbers);

      byteArrays.push(byteArray);
    }

    var blob = new Blob(byteArrays, { type: contentType });
    return blob;
  }

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71416123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档