Android Java не может вызвать функцию из другого класса.Как это сделать? - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь вызвать функцию, чтобы остановить Google VR-плеер из другого класса.Но каждый раз, когда я получаю эту ошибку: Attempt to invoke virtual method 'void com.thevrplugin.cordovapluginvrplayer.MediaLoader.pause()' on a null object reference Я думаю, что я назвал это неправильно, как бы вы это сделали?Может быть, это просто частный / публичный / защищенный модификатор?Ps.Вы можете найти демонстрационный проект здесь: https://github.com/StarStep/cordova-vr-help.git Итак, класс, который имеет следующие функции:

package com.thevrplugin.cordovapluginvrplayer;

...

public class VrVideoActivity extends GvrActivity {

    private static final String TAG = "VrVideoActivity";
    private static final int EXIT_FROM_VR_REQUEST_CODE = 42;
    private GvrView gvrView;
    private Renderer renderer;
    private VideoUiView uiView;
    protected MediaLoader mediaLoader;
    private ControllerManager controllerManager;
    private Controller controller;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mediaLoader = new MediaLoader(this);

        gvrView = new GvrView(this);
        gvrView.setRenderTargetScale(.5f);
        renderer = new Renderer(gvrView);
        gvrView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        gvrView.setRenderer(renderer);
        setContentView(gvrView);

    }

    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        recreate();
    }

    @Override
    protected void onPause() {
        mediaLoader.pause();
        controllerManager.stop();
        super.onPause();
    }
}

и затем вызывается из этого

public class VrPlayer extends CordovaPlugin {

    private String play(Context context, JSONArray args) throws JSONException {
        Intent intent = new Intent(context, VrVideoActivity.class);
        intent.setAction(Intent.ACTION_VIEW);
        JSONObject options = args.getJSONObject(0);
        intent.putExtra("src", options.getString("src"));
        intent.putExtra("displayMode", 0);
        intent.putExtra("inputFormat", 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        return "Ok!";
    }

    private String pause(Context context, JSONArray args) throws JSONException {
        (new VideoActivity()).onPause();
        return "true";
    }

}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Activities создаются платформой Android.Чтобы вызвать методы в Activity, вам понадобится ссылка на это действие, но это, вероятно, приведет к утечке памяти .

Пожалуйста, просмотрите Запустите активность Android из плагина cordova

Вам нужно будет, чтобы ваша VrVideoActivity обрабатывала все поведение пользовательского интерфейса / UX, а затем возвращалась обратно в Cordova WebApp.Вам нужно будет понять разработку Java и Android, особенно Activity Lifecycle

0 голосов
/ 14 марта 2019

Решается путем задания ссылочной переменной и статической функции.

protected MediaLoader mediaLoader;  ---> protected static MediaLoader mediaLoader;
private String pause(Context contex... ---> public static void myPause() 

и тогда я смог назвать это так: VrVideoActivity.myPause();

...