Продвигаться вперед по экрану, получая доступ к информации об узле - PullRequest
2 голосов
/ 10 апреля 2020

У меня есть приложение android, в котором я загружаю apk с веб-сервера и сохраняю его в локальном хранилище после сохранения во внешнем хранилище. Я открываю файл apk программно, а затем устанавливаю apk программно. Это мой код для программной установки приложения.

Intent intent = new Intent(Intent.ACTION_VIEW);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Uri contentUri = FileProvider.getUriForFile(MainActivity.this, "com.ariaware.store.fileProvider", file_path); // Here filepath is location of apk file in local storage
    intent.setDataAndType(contentUri, "application/vnd.android.package-archive");

} else {
    intent.setDataAndType(Uri.fromFile(file_path), "application/vnd.android.package-archive");
}
startActivityForResult(intent, INSTALL);

Этот код выводит меня на этот экран. Пожалуйста, посмотрите здесь. Есть два варианта установки и отмены на этом экране. Теперь пользователю необходимо нажать кнопку «Установить», чтобы установить приложение. enter image description here

Чтобы перейти к следующему экрану, прежде чем нажать. Я запустил службу специальных возможностей, которая берет содержимое экрана и затем перемещается в соответствии с содержимым экрана. Это код для открытия служб специальных возможностей

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent,ACTION_ACCESSIBILITY_SETTINGS);

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

if (nodeInfo != null) {
            int childCount = nodeInfo.getChildCount();
            if ("android.widget.Button".equals(nodeInfo.getClassName())) {
                String nodeContent = nodeInfo.getText().toString();
                Log.d("TAG", "content is " + childCount+nodeContent);
                if (!TextUtils.isEmpty(nodeContent)
                        &&( "install".equals(nodeContent.toLowerCase())
                        || "done".equals(nodeContent.toLowerCase())
                        || "open".equals(nodeContent.toLowerCase())
                     )

                ) {
                    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    return true;
                }
            }
            else if ("android.widget.ScrollView".equals(nodeInfo.getClassName())) {
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
            }

            for (int i = 0; i < childCount; i++) {
                AccessibilityNodeInfo childNodeInfo = nodeInfo.getChild(i);
                if (iterateNodesAndHandle(childNodeInfo)) {
                    return true;
                }
            }


                 }

Основная функция nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);, которая автоматически запускает установку. Посмотрите на эту ссылку. Здесь я разместил видео. Что происходит? Так что после просмотра видео вы узнаете, что он автоматически устанавливается, но после установки запрашивает открытие или готово ... Я хочу выйти из этого экрана. Я выполнил все эти действия, когда появляется экран с установленным приложением, но ничего не происходит

                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY);
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_DISMISS);

Моя основная цель - двигаться вперед, когда приложение установлено. Оно не должно появиться на экране, если вы хотите открыть его или нет

1 Ответ

1 голос
/ 10 апреля 2020

Когда содержание textview становится равным приложению, установленному или не установленному. Вы должны очистить верхний стек и снова начать текущую деятельность

  if(nodeInfo.getText().toString().equalsIgnoreCase("App installed.") ||
                                nodeInfo.getText().toString().equalsIgnoreCase("App not installed.")
                        ||        nodeInfo.getText().toString().contains("couldn't be installed. Free up some space and try again.")
                        )
                        {

                            Intent intent=new Intent(MAIN,MainActivity.class);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                            startActivity(intent);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...