Страницы

Поиск по вопросам

Показаны сообщения с ярлыком webview. Показать все сообщения
Показаны сообщения с ярлыком webview. Показать все сообщения

четверг, 19 марта 2020 г.

WebView Android

#android #webview


Доброго времени суток!
Разработкой приложений под андройд занимаюсь уже относительно давно, но вдруг наткнулся
на весьма необычную проблему с виджетом WebView. Дело в том, что при стандартной настройке
разрешений в главном файле-манифесте Android-приложения:
 

и последующей попытке отобразить определенную HTML-стрницу непосредственно в самом
виджете:
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        WebView wv = (WebView)findViewById(R.id.webView);
        wv.getSettings().setJavaScriptEnabled(true);
        wv.loadUrl("http://www.example.com/");
    }

вроде бы все отображается, но при попытке перейти по ссылкам на странице и прочим
пользовательским действиям всплывает сообщение с просьбой "Выбрать действие по умолчанию(
выполнить действие с помощью )". И от этого мэссэджа никак не избавиться... Что же
мне делать, подскажите пожалуйста?    


Ответы

Ответ 1



Установить для WebView свой WebViewClient, в котором переопределить метод shouldOverrideUrlLoading. Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. Returns True if the host application wants to leave the current WebView and handle the url itself, otherwise return false. http://developer.android.com/reference/android/webkit/WebViewClient.html

понедельник, 2 марта 2020 г.

Можно ли установить `inputType` для клавиатуры в WebView?

#java #android #webview #android_webview #uiwebview


В апплекации есть реализация WebView в котором есть поля для заполнения. Так вот
вопрос в том, можно ли, чтоб при нажатии юзером на поле с указанием номера телефона
открывалась клавиатура с типом android:inputType="number" ?
    


Ответы

Ответ 1



Попробуйте так Создайте подкласс WebView и переопределите метод onCreateInputConnection. Этот метод вызывается при выборе поля ввода в WebView и дает возможность настроить способ обработки события. @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { BaseInputConnection ic = new BaseInputConnection(this, true); outAttrs.inputType = InputType.TYPE_CLASS_NUMBER; // Tells the keyboard to show the number pad return ic; } Источник

среда, 26 февраля 2020 г.

WebView API 28 не работает

#java #android #webview


Есть WebView который подгружает локальный (хранящийся в память приложения) файл index.html

web.loadUrl("file://" + getApplicationContext().getFilesDir().getAbsolutePath() +
"/index.html");


внутри этого html подключается обычные js скрипты, которые тянут данные из интернета.

на API 26 все работает отлично.
НО!
когда я меняю targetSdkVersion на 28 ничего не происходит. данные из интернета просто
не подключаются.

в чем проблема?
    


Ответы

Ответ 1



Современный Android WebView как и многие другие VebWiew во всяких фреймворках вроде JavaFx или Qt используют в качестве движка chromium. Вот ссылки на официальную документацию, как можно удаленно при помощи десктопного хрома отлаживать такие штуковины :) https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews https://developers.google.com/web/tools/chrome-devtools/remote-debugging/ PS: уж простите но я не стал это переводить и писать в тексте сообщения. В двух словах - надо включить RemoteDebugging в десктопном хроме, USB отладку на андроиде и соединить устройства кабелем. После этого в десктопном хроме можно будет увидеть в отладчике то, что происходит на девайсе.

Ответ 2



Огромное спасибо Stranger in the Q за помощь и вот, что нашлось: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/webviews с помощью этого метода я выяснил что у меня в WebView вылетает ошибка Failed to load resource: net::ERR_CLEARTEXT_NOT_PERMITTED а она в свою очередь решается через AndroidManifest.xml добавлением строки: Погуглив я нашел следующую информацию (поправьте меня, если я понял что-то не так!): В Android 8 и выше эту функцию отключили (т.е. раньше она всегда была true, а теперь по умолчанию false) Эта функция отвечает за подключение к HTTP ресурсам. Значит, чтобы получать данные или просто отобразить сайт в WebView надо просто прописать это в Манифесте. (странно, что это не permission) для HTTPS сайтов этого не требуется. все верно?

пятница, 14 февраля 2020 г.

Как достать html код страницы из webView Android?

#java #android #webview


Добрый день. 
Нужно вытащить из WebView Android ссылку на одно изображение. Как можно достучаться
до html из java кода?
    


Ответы

Ответ 1



Согласно en-SO, с API 19 можно так: webView.evaluateJavascript( "(function() { return (''+document.getElementsByTagName('html')[0].innerHTML+''); })();", new ValueCallback() { @Override public void onReceiveValue(String html) { Log.d("HTML", html); // code here } });

Ответ 2



Вы должны первое парсить и найти ссылку до изображения. пример парсинга сайта Или же напрямую указать ссылку изображения. Здесь пример изпользования

четверг, 13 февраля 2020 г.

Трансляция twitch.tv в android

#android #webview #потоки_данных #twitch


Делаю приложение игровой тематики, в которой одна из рубрик - прямые трансляции игр.
Собственно, есть прямые адреса на стримы, к примеру http://player.twitch.tv/?channel=starladder1

Что пытаюсь сделать я:

final WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl(url);


Результат - открывается webview в котором пишется, что надо установить flash player..
Хотя в официальном приложении twitch воспроизводится всё отлично без флэша. Понимаю,
что возможно даже не в ту сторону копаю, но есть ли у кого какие догадки? Буду рад
любой помощи!  
    


Ответы

Ответ 1



Официальное приложение не использует WebView, а использует api твича и проигрывает видео плеером.

Ответ 2



Нашел решение для WebView. Все оказалось просто: webView.loadUrl("http://www.twitch.tv/" + chanelName+ "/popout");

воскресенье, 9 февраля 2020 г.

Как переключить activity при отсутствии интернета?

#java #android #webview


Все привет.
Как переключать activity при отсутствии интернета?

Есть простой webview с ссылкой на сайт.

    public class MainActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView webView = (WebView) findViewById(R.id.webView);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient(new MyWebViewClietn());
        webView.loadUrl("http://google.com/");
    }
}


и есть еще класс TryNetwork

    public class TryNetwork {
    public static boolean check() {
        Runtime localRuntime = Runtime.getRuntime();
        boolean bool = false;
        try {
            int i = localRuntime.exec("/system/bin/ping -c 1 8.8.8.8").waitFor();
            if (i == 0) {
            bool = true;
            }
            return bool;
        }
        catch (InterruptedException localInterruptedException) {
            localInterruptedException.printStackTrace();
            return false;
        }
        catch (IOException localIOException) {
        localIOException.printStackTrace();
        }
        return false;
    }
}


я знаю как переключать экраны простыми кнопками, но тут возникла потребность сделать
переключение автоматическим
google не находит ничего ((

вот второй activity 

    public class BaseActivity extends AppCompatActivity implements View.OnClickListener {
    Button reTry;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

        reTry = (Button) findViewById(R.id.reTry);
        reTry.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.reTry:
                Intent intent = new Intent(this, MainActivity.class);
                startActivity(intent);
                break;
                default:
                    break;
        }
    }
}


и разметка второго activity




Ответы

Ответ 1



Создаем класс для проверки соединения public class NetworkUtils { public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = null; if (cm != null) { activeNetwork = cm.getActiveNetworkInfo(); } return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } и далее там где нужно проверить сеть, например, при старте активности в методе onCreate if (!NetworkUtils.isNetworkAvailable(this)) { startActivity(new Intent(this, PreferenceActivity.class)); }

Ответ 2



Вам нужно в втором классе использовать экземпляр класса проверки соединения. Дальше если метод этого класса возвращает значение false то мы переходим на другое активити. То есть тот переход, что висит на кнопке, просто делать при проверке. Если я правильно понимаю, вам нужно сделать переход с активити BaseActivity на MainActivity. Значит вы должны в классе проверки соединения, возвращать значение true или false в зависимости от наличия соединения. Дальше вам нужно будет вызывать метод класса проверки соединения в активити BaseActivity и если соединение отсутствует то делать переход. Не факт что я все правильно написал, но по логике должно работать. Надеюсь чем-то помог. Удачи :) P.S. Метка android-studio используется для вопросов связанных только с самой IDE, а не с тем что вы там создаете. Поэтому в вам бы посоветовал избегать использования неправильных меток, поскольку здесь это не приветствуется :))

пятница, 24 января 2020 г.

Как можно выполнять/вызывать функции javascript?

#android #javascript #webview #функции


Как в Android в загруженной WebView можно выполнять/вызывать функции javascript?    


Ответы

Ответ 1



По идее, если в вашем JavaScript'е есть функция типа: То ее вызов из Android'а должен выглядеть так: myWebView.loadUrl("javascript:myFunction('Hello World!')");

четверг, 23 января 2020 г.

WebView и получение токена

#android #java #webview #вконтакте #vkontakte_api


Здравствуйте, уважаемые знатоки! Наверное, у меня глупый вопрос, но все же.
Я пытаюсь в андроид-приложении прикрутить авторизацию Вконтакте с помощью WebView.
Мне нужно, чтобы при запуске приложения запускалась активити с WebView, где пользоавтель
мог ввести логин, пароль и после чего получить токен. 
Я делаю так: 
public class LoginActivity extends Activity {

    WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        webview = (WebView) findViewById(R.id.loginWebView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.clearCache(true);

        webview.setWebViewClient(new WebViewClient());
        CookieSyncManager.createInstance(this);

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookie();

        String url = "https://oauth.vk.com/authorize?client_id=123&scope=65544"; 
        webview.loadUrl(url);
    }   
}

В итоге открывается активити, на ней WebView отображает диалог авторизации вконтакте.
А вот что делать дальше, я не знаю. ( Как получить этот токен из вебвью?    


Ответы

Ответ 1



@JuniorTwo, тебе нужно для своего WebView установить WebViewClient. У него есть метод-callback onPageStarted (WebView view, String url, Bitmap favicon). Как видишь, вторым параметром придёт ссылка, в которой будет указан токен. А вот выдрать токен из строки - это уже твоя задача. Сам URL будет типа http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492

воскресенье, 12 января 2020 г.

WebView vs Chromium. В чем разница?

#android_sdk #android #webview


Какая разница между "обычным" WebView и WebView основанном на Chromium? Чем второй
лучше/хуже?
    


Ответы

Ответ 1



Обычный WebView - старый, основаный на Chromium - новый. По сути это вся разница между ними. Новый поддерживается на новых девайсах, умеет больше стандартов, быстрее, что-то устаревшее удалено и т.п. Просто новая версия. http://developer.android.com/guide/webapps/migrating.html - здесь различия на уровне кода https://www.timroes.de/2013/11/23/old-webview-vs-chromium-webview/ - здесь разница в скорости http://www.mobilexweb.com/blog/android-4-4-kitkat-browser-chrome-webview - здесь обзор ситуации

вторник, 7 января 2020 г.

Зафиксировать отображение в WebView

#android #webview


Есть простой WebView mWeb:

            
            


в который я передаю стороку html:

mWeb.loadData(myhtml, "text/html; charset=utf-8", "UTF-8");


Все работает нормально, но когда при прокрутке нечайно сделаешь свайп влево или прово,
текст начинает съезжать. Так вроде и ничего, но тут тоже проблема, текст стает не на
прежнее место после свайпа. Как можно зафиксировать отображение содержимого в WebView
чтобы не свайпилось по бокам?
    


Ответы

Ответ 1



Вам нужно указать действие на свайп: findViewById(R.id.html).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE) return false; } });

понедельник, 23 декабря 2019 г.

Как парсить данные из WebView

#javascript #android #html #парсер #webview


Делаю мобильное приложение для сайта. Сайт не мой, API нет, поэтому его приходится
парсить. Думал обойдусь только JSOUP, но встал вопрос о том, как обрабатывать javascript
кнопки. Позадавав вопросы на англоязычном стаке мне сообщили, что с помощью JSOUP мне
не обработать javascript. 
Решил делать через WebView, но теперь столкнулся с проблемой -  как спарсить страничку
которая сейчас отображена в webview?
    


Ответы

Ответ 1



РЕШЕНИЕ: Пишем обработчик WebView и втыкаем туда Handler. Этот Handler будет драть для нас html странички сразу по завершении загрузки. У меня получилось примерно так: String shit; @JavascriptInterface @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); webview = (WebView) findViewById(R.id.webView); webview.setWebViewClient(new MyWebViewClient()); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setDomStorageEnabled(true); webview.getSettings().setSaveFormData(true); webview.getSettings().setSavePassword(true); webview.getSettings().setLoadsImagesAutomatically(false); webview.addJavascriptInterface(new MyJavaScriptInterface(), "HtmlHandler"); webview.setWebViewClient(new MyWebViewClient() { @Override public void onPageFinished(WebView view, String url) { webview.loadUrl("javascript:window.HtmlHandler.handleHtml" + "(''+document.getElementsByTagName('html')[0].innerHTML+'');"); } }); webview.getSettings().setUserAgentString("Chrome/41.0.2228.0 Safari/537.36"); webview.loadUrl("Ваш Сайт"); } Далее пишем класс MyJavaScriptInterface в котором мы распарсим выдернутую html страницу с помощью JSOUP: private class MyJavaScriptInterface { @JavascriptInterface public void handleHtml(String html) { Document doc = Jsoup.parse(html); shit = doc.select("span[id=j_id178]").first().text(); MainActivity.this.setTitle(shit); } } Естественно еще нужно подключить библиотеку JSOUP в файле build.gradle: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'org.jsoup:jsoup:1.8.3' //вот наша библиотека } Все супер! Теперь заголовок моей Activity принял значение текста в этом id.

среда, 18 декабря 2019 г.

Android: выполнить Javascript в WebView

#android #javascript #webview


Добрый день, нужно по окончании загрузки страницы в WebView автоматически кликнуть
по кнопке. Делаю так, но из WebView кнопка кликается, а программно нет. 
Что можно сделать в данной ситуации? 
Спасибо.

public class RostelecomLoginActivity extends Activity {

WebView webView;
String url;

@SupressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_rostelecom_login);

    Intent webIntent = getIntent();
    final String url = webIntent.getStringExtra("url");

    webView = (WebView) findViewById(R.id.webView1);

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSavePassword(true);
    webSettings.setSaveFormData(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

    webView.setWebViewClient(new WebViewClient() {

        public void onPageLoad(WebView view, String url) {
        }

        public void onPageStarted() {
        }

        public void onPageFinished(WebView view, String url) {
            webView.loadUrl("javascript:document.getElementById('mA').click()");
        }

        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError
error) {
            handler.proceed();
        }

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

    webView.loadUrl(url);
}
}

    


Ответы

Ответ 1



Не видно, чтоб webSettings применялись к webView. Я бы попробовал всё-таки webView.getSettings().setJavaScriptEnabled(true);

Как растянуть карту 2Гис по ширине?

#android #html #java #webview


В WebView загружаю html код:

webViewMap.loadDataWithBaseURL("http://example.com", html, mime, encoding, null);


Отображается карта 2Гис. По размерам она меньше чем WebView. Как ее растянуть по ширине?
    


Ответы

Ответ 1



Нужно у body прописать margin и padding в 0.

вторник, 10 декабря 2019 г.

Как написать android программу для управления люстрой через Webview?

#android #java #webview


Добры вечер.
Я пытаюсь написать android программу для управления люстрой через Webview. Собрал
вот эту схему http://habrahabr.ru/post/159745/ (если кому интересно могу дать полезные
советы по сборке этого девайса) роутер настроил, wifi сеть назвал ON-OFF адрес роутера
192.168.1.1 и из видео урока https://www.youtube.com/watch?v=SrROaEpcIp4 сделал простои
браузер. Всё работает, но есть некоторые пожелания.
Я хочу сделать так чтоб при включении приложения он подключался именно к wifi сети
ON-OFF и потом открывал адрес роутера 192.168.1.1. Если он не в зоне действия или не
возможно открыть адрес роутера 192.168.1.1 выводил соответственное сообщения.
Пожалуйста если можно объясните подробно как это сделать.
С уважением Том    


Ответы

Ответ 1



Попробуйте это. Проверил на WiFi WPA2-PSK WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiConfiguration wifiConf = new WifiConfiguration(); wifiConf.SSID = "\"ON-OFF\""; wifiConf.wepKeys[0] = "\"(пароль)\""; wifiConf.wepTxKeyIndex = 0; wifiConf.preSharedKey = "\"(пароль)\""; wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wifiConf.status = WifiConfiguration.Status.ENABLED; wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wifiConf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConf.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifi.addNetwork(wifiConf); wifi.saveConfiguration(); List list = wifi.getConfiguredNetworks(); for( WifiConfiguration i : list ) { Log.e("SSID", i.SSID); if(i.SSID != null && i.SSID.equals("\"" + "ON-OFF" + "\"")) { Log.e("RSSI_VALUE", "NET_ID " + String.valueOf(i.networkId)); wifi.setWifiEnabled(true); boolean enable = wifi.enableNetwork(i.networkId, true); Log.e("RSSI_VALUE", "ENABLE_WIFI " + String.valueOf(enable)); break; } } В Manifest добавить Для подключение требуется время, поэтому прежде чем загружать страницу стоит удостовериться что подключение завершено.

Ответ 2



Эх, опоздал немного. Написал приложение, выполняющую поставленную задачу. Обязательно измените данные в классе Constants, я использовал свои для теста. А всё остальное подгоните сами по надобности. Исходники (APK находится в папке /bin)

воскресенье, 8 декабря 2019 г.

Как связать несколько ImageView в ScrollView или WebView? - Android

#java #android #webview #imageview


Нужно реализовать, как мне кажется, довольно простую задачу, однако решения, которое
меня бы устраивало я не могу найти уже несколько дней.
Суть такова. Есть 4 картинки которые должны скролиться вместе. Основная картинка
(в нижнем правом углу) должна скролиться во всех направлениях (x, y и по диагонали).
Картинка сверху от нее должна скролиться вместе с ней по горизонтали. Картинка слева
от нее - вместе с ней по вертикали. Ну и картинка в левом верхнем - просто картинка,
которая скролиться не должна.
Ниже приведу 2 варианта решения которые я рассматривал, но не смог их реализовать
так, что бы меня это устраивало.
1 вариант

Разместить ImageView в ScrollView и связать их перемещение в setOnTouchListener:



//просто картинка




    //картинка слева
    




    //картинка сверху
    






    //основная картинка
    








public class Gost8509 extends Activity implements View.OnTouchListener {


    HorizontalScrollView hScroll1, hScroll2;
    VScrollView vScroll1;
    ScrollView vScroll2;
    float mx, my, curX, curY;
    private boolean started = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gost8509);

        hScroll1 = (HorizontalScrollView) findViewById(R.id.scrollHorizontal1);
        hScroll1.setOnTouchListener(this);
        hScroll2 = (HorizontalScrollView) findViewById(R.id.scrollHorizontal2);
        hScroll2.setOnTouchListener(this);
        vScroll1 = (VScrollView) findViewById(R.id.scrollVertical1);
        vScroll1.setOnTouchListener(this);
        vScroll2 = (ScrollView) findViewById(R.id.scrollVertical2);
        vScroll2.setOnTouchListener(this);
        vScroll1.sv = hScroll1;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        curX = event.getX();
        curY = event.getY();
        int x = (int) (mx - curX);
        int y = (int) (my - curY);
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                if (started) {
                    vScroll1.scrollBy(0, y);
                    vScroll2.scrollBy(0, y);
                    hScroll1.scrollBy(x, 0);
                    hScroll2.scrollBy(x, 0);
                } else {
                    started = true;
                }
                mx = curX;
                my = curY;
                break;
            case MotionEvent.ACTION_UP:
                vScroll1.scrollBy(0, y);
                vScroll2.scrollBy(0, y);
                hScroll1.scrollBy(x, 0);
                hScroll2.scrollBy(x, 0);
                started = false;
                break;
        }
        return true;
    }
}


При этом способе у меня перестает работать "бросок" (что естественно) и основная
загвоздка в том, что если основная картинка очень больших размеров, то она перестает
отображаться в эмуляторе.

2 способ
Расположить все картинки в WebView:




    

    

        

    

    

        

    

    

        

    




В этом случае все картинки отображаются без проблем, но если их связать таким образом
как в первом варианте, то картинка при скролле уползает за границы экрана) и опять
естественно не работает "бросок". 

А теперь вопрос )
Как реализовать первый способ, что бы большие картинки отображались на устройстве
и работал бросок?

или

Как реализовать второй способ, что бы работал бросок и картинка в WebView не "убегала"?

или 

Может есть какой-то более рациональный и логичный способ реализовать то, что мне нужно?

Заранее спасибо за все ответы и за понимание!
    


Ответы

Ответ 1



Нашел кое-какое решение. Может не очень красивое, но мне помогло, может кому пригодится: relLayout.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { if (webview1.isFocused()) { webview3.setScrollX(webview1.getScrollX()); } if (webview2.isFocused()) { webview3.setScrollY(webview2.getScrollY()); } if (webview3.isFocused()) { webview1.setScrollX(webview3.getScrollX()); webview2.setScrollY(webview3.getScrollY()); } } }); Таким образом получается, что прокрутки всех 3-х WebView связаны между собой.

четверг, 5 декабря 2019 г.

Android: Кодировка в WebView

#android #html #java #webview


Проблемка такая: есть готовый HTML-код (таблица в основном своём).
Я его записываю в переменную и вывожу через WebView. 
И фишка в том,что у меня текст нормальный, русский в эмуляторе и на смартфоне. А
у друга крякозяблы - что-то с кодировкой не то.
В чём может быть проблема. Пробовал текст хранить и просто как переменная и в файле
- одна малина. 
webView = (WebView) findViewById(R.id.webView);
webView.loadData(text,"text/html","utf-8");

Строка примерного плана:
Не найдено.
    


Ответы

Ответ 1



Попробуй вот это : webView.loadDataWithBaseURL(null, text,"text/html", "UTF-8", null);

среда, 10 июля 2019 г.

Видео (WebView) в полноэкранном режиме не до конца масштабируется под размер экрана

Пишу клиент для сайта. Есть WebView в который грузится контент, в том числе видео. Реализовал чтобы работал полноэкранный режим, но видео разворачивается не во всю ширину экрана. По бокам остается пространство. Прошу помочь советом, что сделал не так или куда смотреть.





public class DescriptionActivity extends Activity {
ProgressDialog mProgressDialog; private WebChromeClient.CustomViewCallback mFullscreenViewCallback; private FrameLayout mFullScreenContainer; private View mFullScreenView; private WebView mWebView;
private static final int SUCCESS = 1; private static final int NETWORK_ERROR = 2; private static final int ERROR = 3;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_description);
mWebView = (WebView) findViewById(R.id.web_view); mFullScreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebChromeClient(mWebChromeClient);
mWebView.setScrollbarFadingEnabled(true); mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); mWebView.setPadding(0, 0, 0, 0);
WebSettings settings = mWebView.getSettings(); settings.setDefaultTextEncodingName("utf-8");
new getHtml().execute(); }
private class getHtml extends AsyncTask { Elements tfa; Elements title; Elements comments;
@Override protected void onPreExecute() { mProgressDialog = new ProgressDialog(DescriptionActivity.this); mProgressDialog.setMessage("Загрузка..."); mProgressDialog.setIndeterminate(false); mProgressDialog.show(); }
@Override protected Integer doInBackground(String... params) { try {
Uri urls = getIntent().getData(); String url = urls.toString();
Document doc = Jsoup.connect(url) .userAgent("Mozilla") .cookie("auth", "token") .timeout(10000) .get();
title = doc.select(".c1-post").select("span"); tfa = doc.select(".c1-post-data"); comments = doc.select(".content").select(".comments");
return SUCCESS; } catch (UnknownHostException e) { Log.e("Unknown Host Exception", "Network error", e); return NETWORK_ERROR; } catch (IOException e) { Log.e("IO Exception", "Failed to load HTML", e); return ERROR; } catch (Exception e) { Log.e("Exception", "An exception occured", e); return ERROR; }
}
@Override protected void onPostExecute(Integer result) {
if (result == 2) { Toast.makeText( getApplicationContext(), "Network connection error. Check your internet connection and try again.", Toast.LENGTH_LONG).show(); } else if (result == 3) { Toast.makeText(getApplicationContext(), "Unknown error. Failed to load.", Toast.LENGTH_LONG).show(); } else if (result == 1) {
String comqqq = Jsoup.clean(comments.toString(), Whitelist.basic());
mWebView.loadDataWithBaseURL("http://fratria.ru/", "" + "

" + title.html() + "

" + tfa.html() + comqqq, "text/html", "en_US", null); }
mProgressDialog.dismiss(); } }
@Override public void onResume() { super.onResume(); mWebView.onResume(); }
@Override public void onPause() { super.onPause(); mWebView.onPause(); }
private final WebChromeClient mWebChromeClient = new WebChromeClient() { @Override @SuppressWarnings("deprecation") public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { onShowCustomView(view, callback); }
@Override public void onShowCustomView(View view, CustomViewCallback callback) { if (mFullScreenView != null) { callback.onCustomViewHidden(); return; }
mFullScreenView = view; mWebView.setVisibility(View.GONE);
mFullScreenContainer.setVisibility(View.VISIBLE); mFullScreenContainer.addView(view); mFullscreenViewCallback = callback; }
@Override public void onHideCustomView() { super.onHideCustomView(); if (mFullScreenView == null) { return; } mWebView.setVisibility(View.VISIBLE);
mFullScreenContainer.setVisibility(View.GONE);
mFullScreenContainer.removeView(mFullScreenView); mFullscreenViewCallback.onCustomViewHidden(); mFullScreenView = null; } };
}


Ответ

Ну для начала я бы посоветовал прятать статус бар
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Тогда у видео будет достаточно высоты что бы при сохранении пропорций заполнить и ширину. Но если у экрана телефона соотношение сторон не соответствует таковому у видео, то тут уж без черных полос не обойдется...

понедельник, 20 мая 2019 г.

Можно ли установить `inputType` для клавиатуры в WebView?

В апплекации есть реализация WebView в котором есть поля для заполнения. Так вот вопрос в том, можно ли, чтоб при нажатии юзером на поле с указанием номера телефона открывалась клавиатура с типом android:inputType="number" ?


Ответ

Попробуйте так
Создайте подкласс WebView и переопределите метод onCreateInputConnection. Этот метод вызывается при выборе поля ввода в WebView и дает возможность настроить способ обработки события.
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { BaseInputConnection ic = new BaseInputConnection(this, true); outAttrs.inputType = InputType.TYPE_CLASS_NUMBER; // Tells the keyboard to show the number pad return ic; }
Источник

вторник, 23 апреля 2019 г.

Трансляция twitch.tv в android

Делаю приложение игровой тематики, в которой одна из рубрик - прямые трансляции игр. Собственно, есть прямые адреса на стримы, к примеру http://player.twitch.tv/?channel=starladder1
Что пытаюсь сделать я:
final WebView webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); webView.setWebChromeClient(new WebChromeClient()); webView.loadUrl(url);
Результат - открывается webview в котором пишется, что надо установить flash player.. Хотя в официальном приложении twitch воспроизводится всё отлично без флэша. Понимаю, что возможно даже не в ту сторону копаю, но есть ли у кого какие догадки? Буду рад любой помощи!


Ответ

Нашел решение для WebView. Все оказалось просто:
webView.loadUrl("http://www.twitch.tv/" + chanelName+ "/popout");

воскресенье, 14 апреля 2019 г.

Как переключить activity при отсутствии интернета?

Все привет. Как переключать activity при отсутствии интернета?
Есть простой webview с ссылкой на сайт.
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.setWebViewClient(new MyWebViewClietn()); webView.loadUrl("http://google.com/"); } }
и есть еще класс TryNetwork
public class TryNetwork { public static boolean check() { Runtime localRuntime = Runtime.getRuntime(); boolean bool = false; try { int i = localRuntime.exec("/system/bin/ping -c 1 8.8.8.8").waitFor(); if (i == 0) { bool = true; } return bool; } catch (InterruptedException localInterruptedException) { localInterruptedException.printStackTrace(); return false; } catch (IOException localIOException) { localIOException.printStackTrace(); } return false; } }
я знаю как переключать экраны простыми кнопками, но тут возникла потребность сделать переключение автоматическим google не находит ничего ((
вот второй activity
public class BaseActivity extends AppCompatActivity implements View.OnClickListener { Button reTry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_base);
reTry = (Button) findViewById(R.id.reTry); reTry.setOnClickListener(this); }
@Override public void onClick(View v) { switch (v.getId()) { case R.id.reTry: Intent intent = new Intent(this, MainActivity.class); startActivity(intent); break; default: break; } } }
и разметка второго activity