HarmonyOS鸿蒙Next中资源文件不能使用FileInputStream方式或是ImageSource.create(filedescriptor,null)读取的问题

HarmonyOS鸿蒙Next中资源文件不能使用FileInputStream方式或是ImageSource.create(filedescriptor,null)读取的问题

利用FileInputStream fileInputStream=FileInputStream(FileDescriptor)或是ImageSource.create(FileDescriptor,null)读取resources/media下的图片时,没法读取,是什么原因?利用Resource方法我会的,不用贴Resource方法示范了,谢谢。代码如下:

private FileInputStream fileInputStream;    
Resource resource;    
private ImageSource imageSource;   
private FileDescriptor fileDescriptor;    

@Override
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);
    try {
        fileDescriptor=getResourceManager().getRawFileEntry(getResourceManager().getMediaPath(ResourceTable.Media_icon)).openRawFileDescriptor().getFileDescriptor();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NotExistException e) {
        e.printStackTrace();
    } catch (WrongTypeException e) {
        e.printStackTrace();
    }
    Image image=(Image)findComponentById(ResourceTable.Id_image_show);
    imageSource=ImageSource.create(fileDescriptor,null);
    image.setPixelMap(imageSource.createPixelmap(null));
}

错误如下:

Device info:LIO-AN00Build info:LIO-AN00 2.0.0.218(C00E215R6P6)
Module name:com.example.myapplication8877
Version:1.0.0
Pid:22337
Uid:11444
Foreground:Yes
Reason:crash
Selected stacktrace:
ohos.media.image.SourceDataMalformedException: image decode failed
at ohos.media.image.ImageSource.nativeCreateImageSource(Native Method)
at ohos.media.image.ImageSource.create(ImageSource.java:694)
at com.example.myapplication.slice.MainAbilitySlice.onStart(MainAbilitySlice.java:51)
at ohos.aafwk.ability.AbilitySlice.start(AbilitySlice.java:3270)
at ohos.aafwk.ability.AbilitySliceScheduler.handleStartAbilitySlice(AbilitySliceScheduler.java:717)
at ohos.aafwk.ability.AbilitySliceManager.onAbilityStart(AbilitySliceManager.java:300)
at ohos.aafwk.ability.Ability.dispatchAbilityLifecycle(Ability.java:4579)
at ohos.aafwk.ability.Ability.start(Ability.java:3634)
at ohos.aafwk.ability.Ability.handleLifecycleTransaction(Ability.java:4751)
at ohos.aafwk.ability.Ability.scheduleAbilityLifecycle(Ability.java:1517)
at ohos.abilityshell.AbilityShellDelegate.scheduleAbilityLifecycle(AbilityShellDelegate.java:132)
at ohos.abilityshell.AbilityShellActivityDelegate.onStart(AbilityShellActivityDelegate.java:340)
at ohos.abilityshell.AbilityShellActivity.onStart(AbilityShellActivity.java:67)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1447)
at android.app.Activity.performStart(Activity.java:8237)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4084)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:235)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:215)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:187)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:105)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2613)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8668)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
10 回复
楼主你好,请参考如下代码:

```java
[@Override](/user/Override)
public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);

    Image image=(Image)findComponentById(ResourceTable.Id_image_show);
    image.setPixelMap(transId2PixelMap(getContext(), ResourceTable.Media_icon));
}

public static PixelMap transId2PixelMap(Context context, int resId) {
    InputStream source = null;
    ImageSource imageSource = null;
    try {
        source = context.getResourceManager().getResource(resId);
        imageSource = ImageSource.create(source, null);
        ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
        decodingOpts.desiredSize = new Size(100, 100);
        return imageSource.createPixelmap(decodingOpts);
    } catch (IOException | NotExistException e) {
    } finally {
        try {
            source.close();
        } catch (IOException e) {
        }
    }
    Optional<PixelMap> optionalEmpty = Optional.empty();
    return optionalEmpty.orElse(null);
}

更多关于HarmonyOS鸿蒙Next中资源文件不能使用FileInputStream方式或是ImageSource.create(filedescriptor,null)读取的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我感觉要么是FileDescriptor有Bug,要么是ImageSource.create()方法暂时还没写好

我也是这样想的,

再查看一下图片icon的格式符不符合读写要求。

利用Resource的方式都能显示出来,格式应该没问题,

首先,你要查看一下Media文件夹下的icon图标存不存在。如果存在,那很有可能是图片的格式不支持,看能不能用代码先实现一下图片格式的转换,再读写图片信息。

用imageSource.create(resource,null)的方式是可以显示这个icon图标的,

欢迎开发小伙伴们进来帮帮楼主

在HarmonyOS鸿蒙Next中,资源文件的读取方式与传统的Android开发有所不同。鸿蒙系统采用了新的资源管理机制,资源文件通常存储在resources目录下,并且通过ResourceManager进行访问。因此,直接使用FileInputStreamImageSource.create(filedescriptor, null)来读取资源文件可能会导致问题。

鸿蒙系统推荐使用ResourceManager提供的API来访问资源文件。例如,可以通过ResourceManager.getResource方法获取资源的RawFileDescriptor,然后使用ImageSource.create来加载图片资源。具体代码如下:

import resourceManager from '@ohos.resourceManager';

let resourceMgr = resourceManager.getResourceManager();
let rawFileDescriptor = resourceMgr.getRawFileDescriptor('entry/resources/base/media/image.png');
let imageSource = image.createImageSource(rawFileDescriptor.fd, null);

对于其他类型的资源文件,如文本文件,可以使用ResourceManager.getRawFileContent方法直接获取文件内容:

let fileContent = resourceMgr.getRawFileContent('entry/resources/base/media/text.txt');

这种方式确保了资源文件在鸿蒙系统中的正确访问和管理,避免了直接使用FileInputStreamImageSource.create(filedescriptor, null)可能带来的兼容性问题。

在HarmonyOS鸿蒙Next中,资源文件的读取方式与传统的Android开发有所不同。由于鸿蒙系统对资源管理进行了优化,直接使用FileInputStreamImageSource.create(filedescriptor, null)可能会导致读取失败。建议使用鸿蒙提供的ResourceManager API来访问资源文件,例如通过ResourceManager.getResource方法获取资源流。这样可以确保资源文件在鸿蒙系统中被正确加载和使用。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!