OneSignal - помогите мне открыть URL-адрес в существующем веб-представлении, я так запутался

У меня был кто-то, кто создал для меня очень простое приложение WebView с уведомлениями OneSignal. Приложение запускается с заставкой, а затем с двумя кнопками на главной странице, которые отправляют пользователей по разным URL-адресам — в моем примере ниже Google и Stack Overflow.

Он работает нормально, но я пытаюсь внести изменения, чтобы открывать определенный URL-адрес при нажатии на уведомление, и не могу понять, как это сделать, несмотря на то, что много читал здесь и в документации OneSignal. В крайнем случае я решил опубликовать свой код, чтобы узнать, может ли кто-нибудь помочь этому новичку в кодировании приложений!

По сути, мне нужно исправить код launchURL в самом низу класса ExampleNotificationOpenedHandler. Я отправляю URL-адрес в качестве дополнительных данных через OneSignal, и приложение правильно считывает его в переменной launchURL (когда я просматриваю logcat).

public class App extends Activity {


    private static final String WEB_URL1 = "https://google.com";
    private static final String WEB_URL2 = "https://stackoverflow.com";

    View ll_Web;
    WebView webView;
    SwipeRefreshLayout mSwipeRefreshLayout;
    RelativeLayout splash, home;
    View ll_pView, pView;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client2;


    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        OneSignal.startInit(this)
                .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
                .init();

        setContentView(R.layout.main);

        ll_Web = findViewById(R.id.ll_Web);
        webView = (WebView) findViewById(R.id.webView);
        splash = (RelativeLayout) findViewById(R.id.splash);
        home = (RelativeLayout) findViewById(R.id.home);

        ll_pView = (View) findViewById(R.id.ll_pView);
        pView = (View) findViewById(R.id.pView);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(false);
        webView.getSettings().setPluginState(PluginState.ON);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int progress) {
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(pView.getLayoutParams());
                lp.weight = progress;
                pView.setLayoutParams(lp);

                ll_pView.setVisibility(progress == 100 ? View.GONE : View.VISIBLE);
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                mSwipeRefreshLayout.setRefreshing(false);
                ll_pView.setVisibility(View.GONE);

                super.onPageFinished(view, url);

            }
        });
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout);

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                webView.reload();
            }
        });


        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                webView.clearHistory();
                webView.loadUrl(WEB_URL1);
                home.setVisibility(View.GONE);
                ll_Web.setVisibility(View.VISIBLE);
            }
        });

        findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                webView.clearHistory();
                webView.loadUrl(WEB_URL2);
                home.setVisibility(View.GONE);
                ll_Web.setVisibility(View.VISIBLE);
            }
        });

        (new Handler()).postDelayed(new Runnable() {
            @Override
            public void run() {
                home.setVisibility(View.VISIBLE);
                splash.setVisibility(View.GONE);
            }
        }, 3 * 1000);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.

    }

    @Override
    public void onBackPressed() {
        if (ll_Web.getVisibility() == View.VISIBLE) {

            if (webView.canGoBack() && !webView.getUrl().equals(WEB_URL1) && !webView.getUrl().equals(WEB_URL2)) {
                webView.goBack();
            } else {
                home.setVisibility(View.VISIBLE);

                if (Build.VERSION.SDK_INT < 18) {
                    webView.clearView();
                } else {
                    webView.loadUrl("about:blank");
                }
                ll_Web.setVisibility(View.GONE);
            }
        } else
            super.onBackPressed();

    }

    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */


    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        //client2.connect();

    }

    @Override
    public void onStop() {
        super.onStop();


    }



class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
        // This fires when a notification is opened by tapping on it.

        @Override
        public void notificationOpened(OSNotificationOpenResult result) {
            OSNotificationAction.ActionType actionType = result.action.type;
            JSONObject data = result.notification.payload.additionalData;
            String launchURL;

            if (data != null) {
                launchURL = data.optString("launchURL");
                if (launchURL != null) {
                    Log.i("OneSignalExample", "launchURL value: " + launchURL);


           //        How do I send the LaunchURL to open webview???
           //        webView.loadUrl(launchURL);


                }


            }

        }
    }


}

Я не писал этот код, но буду признателен за любую помощь.


person AussieM8    schedule 03.06.2018    source источник


Ответы (2)


сделай как ты с кнопкой

    if (launchURL != null) {
                Log.i("OneSignalExample", "launchURL value: " + launchURL);


                webView.clearHistory();
                    webView.loadUrl(launchURL);
                    home.setVisibility(View.GONE);
                    ll_Web.setVisibility(View.VISIBLE); 


            }

я думаю, что веб-просмотр не создается, когда для него указан URL-адрес, добавьте прослушиватель действий в onStart, если вы можете

    @Override
    protected void onStart()
   {
        super.onStart();
     OneSignal.startInit(this)
            .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
            .init();

       }

     }

или хотя бы после setContentView(R.layout.main); как здесь

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
          OneSignal.startInit(this)
                .setNotificationOpenedHandler(new 
                   ExampleNotificationOpenedHandler())
                      .init();
person nima moradi    schedule 03.06.2018
comment
Я уже пробовал это, но получил эту ошибку - java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.webkit.WebView.clearHistory ()» для ссылки на нулевой объект - person AussieM8; 03.06.2018
comment
Я действительно надеюсь получить ответ на этот вопрос... для меня это звучит так, будто "нулевой" объект является частью "webView", поэтому я предполагаю, что мне может понадобиться ссылаться на него по-другому, если он находится в методе onCreate :( - person AussieM8; 04.06.2018
comment
возможно, webView еще не создан в обратном вызове onesignal, проверьте, что то, что я делаю в обновленном ответе, решает проблему или нет - person nima moradi; 04.06.2018
comment
Спасибо за попытку помочь мне, но эти изменения не помогли. Однако я провел дополнительное тестирование и обнаружил, что оно действительно работает, если приложение уже открыто ??? Не уверен, что эта дополнительная информация полезна для этой проблемы. - person AussieM8; 05.06.2018
comment
если приложение открыто, это означает, что веб-просмотр уже создан, но когда вы нажимаете на уведомление, когда приложение закрыто, веб-просмотр еще не создан, попробуйте сохранить данные в переменной, а когда веб-просмотр создан, измените его URL-адрес, используйте отладку, чтобы найти свое решение - person nima moradi; 05.06.2018
comment
Большое спасибо за ваше терпение... Я последовал вашему совету и создал статическую переменную в классе ExampleNotificationOpenedHandler, а затем использовал эту переменную в действии. Сейчас не работаю на 100%, но я на правильном пути благодаря @nima_moradi - person AussieM8; 09.06.2018

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

Еще раз спасибо @nimi_moradi за совет, который помог мне решить мою проблему.

class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
    // This fires when a notification is opened by tapping on it and
    // puts the launchURL additional data into a string for use in the main activity
    public static String launchURL;

    @Override
    public void notificationOpened(OSNotificationOpenResult result) {
        OSNotificationAction.ActionType actionType = result.action.type;
        JSONObject data = result.notification.payload.additionalData;
        //public String launchURL;

        if (data != null) {
            launchURL = data.optString("launchURL");
            if (launchURL != null) {
              //  Log.i("OneSignalExample", "launchURL value: " + launchURL);
            }
        }

    }
}



public class App extends Activity {


    private static final String WEB_URL1 = "https://google.com";
    private static final String WEB_URL2 = "https://stackoverflow.com";

    View ll_Web;
    WebView webView;
    SwipeRefreshLayout mSwipeRefreshLayout;
    RelativeLayout splash, home;
    View ll_pView, pView;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client2;


    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        OneSignal.startInit(this)
                .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
                .init();

        setContentView(R.layout.main);

        ll_Web = findViewById(R.id.ll_Web);
        webView = (WebView) findViewById(R.id.webView);
        splash = (RelativeLayout) findViewById(R.id.splash);
        home = (RelativeLayout) findViewById(R.id.home);

        ll_pView = findViewById(R.id.ll_pView);
        pView = findViewById(R.id.pView);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(false);
        webView.getSettings().setPluginState(PluginState.ON);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int progress) {
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(pView.getLayoutParams());
                lp.weight = progress;
                pView.setLayoutParams(lp);

                ll_pView.setVisibility(progress == 100 ? View.GONE : View.VISIBLE);
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                mSwipeRefreshLayout.setRefreshing(false);
                ll_pView.setVisibility(View.GONE);

                super.onPageFinished(view, url);

            }
        });
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout);

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                webView.reload();
            }
        });


        //Splash screen and main menu (unless launchURL exists)
        (new Handler()).postDelayed(new Runnable() {
            @Override
            public void run() {
                if ("".equals(ExampleNotificationOpenedHandler.launchURL) || ExampleNotificationOpenedHandler.launchURL==null){
                    // Show home screen with menu buttons
                    home.setVisibility(View.VISIBLE);
                }
                // Show splash screen for three seconds
                splash.setVisibility(View.GONE);
            }
        }, 3 * 1000);


        // if launchURL contains data, open that
        if (!"".equals(ExampleNotificationOpenedHandler.launchURL)) {
            home.setVisibility(View.GONE);
            ll_Web.setVisibility(View.VISIBLE);
            webView.clearHistory();
            webView.loadUrl(ExampleNotificationOpenedHandler.launchURL);

        }

        // Menu button one tapped - Google
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                webView.clearHistory();
                webView.loadUrl(WEB_URL1);
                home.setVisibility(View.GONE);
                ll_Web.setVisibility(View.VISIBLE);
            }
        });

        // Menu button two tapped - Stack Overflow
        findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                webView.clearHistory();
                webView.loadUrl(WEB_URL2);
                home.setVisibility(View.GONE);
                ll_Web.setVisibility(View.VISIBLE);
            }
        });

    }

    @Override
    public void onBackPressed() {
        if (ll_Web.getVisibility() == View.VISIBLE) {

            if (webView.canGoBack() && !webView.getUrl().equals(WEB_URL1) && !webView.getUrl().equals(WEB_URL2)) {
                webView.goBack();
            } else {
                home.setVisibility(View.VISIBLE);

                if (Build.VERSION.SDK_INT < 18) {
                    webView.clearView();
                } else {
                    webView.loadUrl("about:blank");
                }
                ll_Web.setVisibility(View.GONE);
            }
        } else
            super.onBackPressed();

    }


    @Override
    public void onStart() {
        super.onStart();
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        //client2.connect();

    }


    @Override
    public void onStop() {
        super.onStop();


    }



}
person AussieM8    schedule 09.06.2018