Я пытаюсь создать текстуру Gdx с файлом изображения, расположенным в общей папке на моем ПК. Код хорошо работает в настольном приложении (но он работает и без использования SmbFile...), но вылетает в приложении для Android. Я получаю сообщение об ошибке «Нет такого файла или каталога». Кто-нибудь знает, как мы можем это сделать? Спасибо !

        public void create () {
        Gdx.app.setLogLevel(Application.LOG_DEBUG);

        batch = new SpriteBatch();

        SmbFile file=null;

        try {
            file = new SmbFile("smb://***path to shared folder***/icon-152.png");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        FileHandle fileHandle;
        fileHandle = new FileHandle(file.getUncPath());

        img = new Texture(fileHandle); //***No such file or directory***
        //img = new Texture(Gdx.files.external(file.getUncPath())); //***No such file or directory***
    }

Дополнение: я пытался скопировать файл в активы, прежде чем загружать его как текстуру. Все еще работает нормально в настольном приложении, но все еще имеет ошибку в приложении для Android: Java.io.FiliNotFound Exception.

    public void create () {
        Gdx.app.setLogLevel(Application.LOG_DEBUG);

        batch = new SpriteBatch();

        SmbFile file=null;

        try {
            file = new SmbFile("smb://***path to shared folder***/icon-152.png");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(file.getUncPath());
            os = new FileOutputStream("test.png");
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
            is.close();
            os.close();
        }
        catch(java.io.IOException e){
            Gdx.app.log("", e.getMessage()); //***Java.io.FileNotFound Exception***
        }

        img = new Texture("test.png"); //***No such file or directory***

    }
3
Dudule 7 Дек 2019 в 21:18
Я предполагаю, что к общим папкам нельзя получить доступ с помощью пути smb://* на Android. Может быть, вы могли бы попробовать создать подкласс FileHandle, чтобы обернуть SmbFile, который, как я полагаю, имеет доступ к общим папкам? У меня нет опыта работы с SMB, поэтому я не могу сказать.
 – 
Nicolas
8 Дек 2019 в 06:03

1 ответ

Да Николас,

Я, наконец, сделал это, сначала скопировав файл в локальный. Он работает как на Android, так и на настольном приложении. Если кому интересно, две функции loadFile и saveFile :


        loadFile( "//***path to shared folder***/icon-152.png","icon-152.png");

        saveFile("icon-152.png", "//HP2285/***path to shared folder***/icon-152.png");

    }

    public void loadFile(String smbFilePath, String fileName){

        try {
            SmbFile file = new SmbFile("smb:"+smbFilePath);
            InputStream is = new SmbFileInputStream(file);

            FileHandle fhd = Gdx.files.local(fileName);
            OutputStream os = fhd.write(false);

            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }

            is.close();
            os.close();
        }
        catch(Exception e){
        }
    }

    public void saveFile(String fileName, String smbFilePath){

        try {
            SmbFile file = new SmbFile("smb:"+smbFilePath);
            OutputStream os = new SmbFileOutputStream(file);

            FileHandle fhs = Gdx.files.local(fileName);
            InputStream is = fhs.read();

            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read (buffer)) > 0) {
                os.write(buffer, 0, length);
            }

            is.close();
            os.close();
        }
        catch(Exception e){
        }

    }
0
Dudule 9 Дек 2019 в 21:13