Добавить и получить доступ к файлу в приложении Google Chrome ARC

Я пытаюсь протестировать приложение, которое работает как ssh-клиент. Поэтому в данный момент мы используем закрытый ключ, который находится в хранилище на устройстве Android. Чтобы подключиться к серверу ssh, пользователь выбирает ключ в диалоговом окне файла.

Как передать файл в файловую систему ARC, чтобы использовать его в приложении, запущенном дуговой сварщик ?

Я попробовал решение, предложенное в сообщении о доступе к внешнему хранилищу, но даже с Включены экспериментальные параметры разработчика. Я не смог понять седьмой шаг («Перейдите на вкладку «Эксперименты», указанную в левой части всплывающего окна. Это видно, только если вы вообще включили экспериментальные функции»). нет "Экспериментального" варианта.


Из-за комментариев я использую Intent.ACTION_GET_CONTENT вместо FileDialog. Я на шаг впереди. Теперь у меня есть диалоговое окно файла Android в ARC. Однако я не могу выбирать файлы, кроме txt-files.x. Я также пробовал "intent.setType(*/*)", как указано в этом опубликовать.

private void activity_android_open(View view) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("file/*");
    startActivityForResult(intent, 0);
}

Я могу выбрать ключ и получить путь к файлу на своем устройстве Android с помощью следующих методов (из -uri-for-intent-action-get-content">здесь). Однако при использовании ARC я могу выбрать файлы с моего тома, но путь к файлу пуст. Тосты показывают правильное расположение файла на моем устройстве Android. Однако в сварщике строка пуста.

/**
 * Opens file dialog to choose RSA key???
 * @param view The current view, here the button pressed.
 */
public void activity_simple_open(View view){
    // see https://stackoverflow.com/questions/29425408/local-file-access-on-google-chrome-arc/29426331#29426331
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE);   
    intent.setType("*/*");
    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode==RESULT_OK){
            Uri uri = data.getData();
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    filePath = Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
        }
        showToast(filePath);
        // We need an Editor object to make preference changes.
        // All objects are from android.context.Context
        SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(getString(R.string.prefKey_privKeyFilePath), filePath);
        editor.commit();
}

private void showToast(String message){
    Toast toast = Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG);
    toast.show();
}

Когда я использую chrome://inspect/#apps для просмотра журнала, я получаю сообщение об ошибке

Uncaught (in promise) 
TypeError: Cannot read property 'retainKey' of undefined {stack: (...), message: "Cannot read property 'retainKey' of undefined"} message: "Cannot read property 'retainKey' of undefined"
stack: "TypeError: Cannot read property 'retainKey' of undefined↵    at chrome-extension://adhppmdiaclmoepimdhlkdelgabmhdlf/_modules/mfaihdlpglflfgpfjcifdjdjcckigekc/gen_index.min.js:67:114"get stack: function () { [native code] }arguments: nullcaller: nulllength: 0name: ""prototype: StackTraceGetterconstructor: function () { [native code] }__proto__: Object__proto__: function Empty() {}apply: function apply() { [native code] }arguments: nullbind: function bind() { [native code] }call: function call() { [native code] }caller: nullconstructor: function Function() { [native code] }length: 0name: "Empty"toString: function toString() { [native code] }__proto__: Object<function scope><function scope>No Scopesset stack: function () { [native code] }__proto__: Error(anonymous function) @ filesystem.js:546

person Stefan Bollmann    schedule 18.04.2015    source источник
comment
Используйте ACTION_GET_CONTENT, чтобы открыть приложение «Файлы Chrome OS».   -  person CommonsWare    schedule 18.04.2015
comment
@CommonsWare Я использую библиотеку aFileDialog. Кажется, все в порядке. Однако я вижу обычную файловую структуру системы Android. Но как я могу добавить внешний контент в эту структуру или как я могу получить доступ к внешним файлам? Мне нужен ключ rsa...   -  person Stefan Bollmann    schedule 19.04.2015
comment
как я могу получить доступ к внешним файлам? -- как я уже писал, используйте ACTION_GET_CONTENT, чтобы вызвать приложение Chrome OS Files. Следовать инструкциям, на которые вы ссылаетесь, вероятно, бессмысленно, поскольку пользователи не смогут этого сделать, даже если вы это сделаете. Пользователи будут ожидать, что они выберут файл со своего компьютера с Chrome OS, потому что все остальные приложения для Chrome OS будут делать это именно так. Единственный известный мне способ сделать это в ARC — использовать ACTION_GET_CONTENT для запуска приложения Chrome OS Files.   -  person CommonsWare    schedule 19.04.2015
comment
См. также: stackoverflow.com/a/29426331/115145   -  person CommonsWare    schedule 19.04.2015
comment
возможный дубликат доступа к локальному файлу в Google-Chrome-ARC?   -  person Xan    schedule 20.04.2015
comment
Не думаю, что это дубликат. Теперь локальный доступ к файлам в принципе возможен с помощью ACTION_GET_CONTENT. Однако я хотел бы использовать закрытый ключ ssh. Это можно сделать с помощью внешнего приложения на Android (файловый менеджер oi) или плагина (aFileManager). Однако я не вижу, как это сделать с помощью ACTION_GET_CONTENT, потому что закрытый ключ нельзя выбрать.   -  person Stefan Bollmann    schedule 26.04.2015


Ответы (1)


ChomeOs/ARC «запускает» Kitkat, поэтому вы можете использовать Android Storage Access Framework для получения файлов.

Это поможет вам начать:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
activity.startActivityForResult(intent, 1);
person Felipe    schedule 01.05.2015