Как я могу разместить исполняемый файл в приложении Flutter? - PullRequest
3 голосов
/ 28 мая 2020

У меня есть проект basi c flutter, работающий на android, где при запуске приложения я пишу исполняемый файл, связанный с моими ресурсами.

void writeExecutable() async {

    DIR = '/data/data/com.maksimdan.face_merger';
    var path = join(DIR, 'main');

    if (await File(path).exists()) {
      File(path).delete();
      print('delete executable');
    } else {
      print('executable does not exist');
    }
  }

Позже в коде я пытаюсь запустить это.

Process.run(path, []).then((ProcessResult results) {
        print(results.stdout);
      });

Но получить разрешение отклонено, ошибка.

E/flutter ( 8122): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: ProcessException: No such file or directory
E/flutter ( 8122):   Command: /data/data/com.maksimdan.face_merger/main

Я также пробовал:

      Process.run('/system/bin/chmod', ['744', path]).then((ProcessResult results) {
        print('shell1 complete');
        Process.run(path, []).then((ProcessResult results) {
          print('shell2 complete');
          print(results.stdout);
        });
      });

Но получите Unhandled Exception: ProcessException: No such file or directory

Предполагая, что исполняемый файл работает, есть ли способ запустить свои собственные исполняемые файлы в трепещут с нужными разрешениями? На собственном android есть возможность использовать эту стратегию для file.setExecutable(true);. ( Размещение исполняемого файла в Android приложении )

Или мне придется экспериментировать с каналами методов?


pubspe c .yml

name: face_merger
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  sqflite: ^1.3.0+2
  process_run: ^0.10.10+1
  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter


flutter:
  uses-material-design: true
  assets:
    - lib/py/dist/main

Я также проверил, что файл был записан во внутреннюю память устройства, на которое, как я ожидал, он будет записан с использованием android studio устройства explore.

screenshot of executable within the android simulator

Ответы [ 2 ]

0 голосов
/ 06 июня 2020

Вам нужно указать расширение файла .db в конце имени базы данных (предполагается, что DB_DIR предназначен для базы данных). var path = join (DB_DIR, 'main.db');

Тогда, я думаю, вы можете использовать пакет path_provider и использовать

Directory documentsDirectory = await getApplicationDocumentsDirectory();

для каталога где вы обращаетесь к базе данных.

0 голосов
/ 03 июня 2020

Помимо разрешения на запись, вам необходимо иметь разрешение на чтение в вашем приложении.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

...

...