Веб-приложение получает разрешения, но вылетает, когда вы их используете - PullRequest
0 голосов
/ 03 мая 2019

В настоящее время я работаю над приложением для веб-просмотра в Android Studio, но я веб-разработчик и, конечно, немного растерялся.Это приложение должно иметь доступ к камере, телефонным звонкам и другим функциям, поэтому после исследования мне удалось объявить и запросить их с помощью всплывающих окон, но даже если пользователь предоставит их, приложение будет зависать при каждом нажатии кнопокдля камеры или телефонного звонка, и я не могу понять, в чем или где проблема.Этого не происходит в браузере ПК или даже браузере телефона.

Прежде всего я узнал, что разрешения должны быть объявлены в AndroidManifest.xml, и поэтому я записал их.Затем я прочитал, что мне нужно написать те функции, которые фактически запрашивают эти разрешения, и после нескольких дней поиска я смог найти только один метод, который я понял, но таким образом пользователю предлагается всплывающее окно со всеми всплывающими окнами в началевыполнение.По крайней мере, это сработало, потому что я смог проверить информацию о приложении и подтвердить ее, но после всего этого при каждом нажатии одной из кнопок, выполняющих действие, происходит сбой всего приложения, и теперь я не уверен, что делать.

Это мой AndroidManifest.xml, где я объявил разрешения:

    <!-- Internet --> 
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- Storage--> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <!-- Camera-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <!-- Location-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- Phone-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
    <uses-permission android:name="android.permission.ADD_VOICEMAIL" />
    <uses-permission android:name="android.permission.USE_SIP" />
    <!-- Calendar--> 
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <!-- Contacts--> 
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- SMS--> 
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />

Тогда это то, что я сделал в MainActivity.java, сначала мой метод onCreate:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Código agregado
        mWebView = (WebView) findViewById(R.id.activity_main_webview);
        // Activamos jаvascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        // Activamos el LocalStorage
        webSettings.setDomStorageEnabled(true);
        // Activamos el focus tactil
        mWebView.setFocusable(true);
        mWebView.setFocusableInTouchMode(true);
        // Configuraciones varias
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        mWebView.getSettings().setDatabaseEnabled(true);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        // Url que carga la app (webview)
        mWebView.loadUrl("http://reclamador.globalten.es");
        // Forzamos el webview para que abra los enlaces internos dentro de la la APP
        mWebView.setWebViewClient(new WebViewClient());
        // Forzamos el webview para que abra los enlaces externos en el navegador
        mWebView.setWebViewClient(new MyAppWebViewClient());
        // Permite inspeccionar el codigo a traves de chrome
        mWebView.setWebContentsDebuggingEnabled(true);
        // Fin del código agregado

        // Código añadido
        int Permission_All = 1;

        String[] Permissions = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.MEDIA_CONTENT_CONTROL, Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        if(!hasPermissions(this, Permissions)){
            ActivityCompat.requestPermissions(this, Permissions, Permission_All);
        }
        // Fin del código añadido
    }

Затемметод, чтобы проверить, были ли они уже предоставлены:

// Codigo añadido
    public static boolean hasPermissions(Context context, String... permissions){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M && context!=null && permissions!=null){
            for(String permission: permissions){
                if(ActivityCompat.checkSelfPermission(context, permission) !=PackageManager.PERMISSION_GRANTED){
                    return false;
                }
            }
        }
        return true;
    }
    // Fin del código añadido

Как я уже сказал, это веб-приложение, поэтому я не знаю, как связать кнопки с всплывающими окнами, каждый учебник, который я видел, показываетВы, как создать кнопку на AndroidStudio, но в моем случае это полноценный веб.Кнопка телефонного звонка внутри сети - это тег. Для почты есть еще одно, но я не вижу никаких разрешений, связанных с этим делом. И есть некоторые входы для изображений галереи или с помощью камеры, которые тоже не работают, я только что закончил изучатьвеб-разработка, так что не будьте слишком резкими со мной и спасибо за ваше время и помощь!

РЕДАКТИРОВАТЬ

Мне удалось решить проблемы как tel:, так и mailto: путем изменения метода внутри MyAppWebViewClient.класс (MyAppWebViewClient.java) из

// Código agregado
public class MyAppWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // Url base de la APP (al salir de esta url, abre el navegador) poner como se muestra, sin https://
        if(Uri.parse(url).getHost().endsWith("reclamador.globalten.es")) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }
}
// Fin del código agregado*/

К этому:

public class MyAppWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mailto:") || url.startsWith("mms:") || url.startsWith("mmsto:") || url.startsWith("market:")) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            view.getContext().startActivity(intent);
            return true;
        } else {
            view.loadUrl(url);
            return true;
        }
    }
}

Теперь у меня есть проблема только с входными файлами, которые могут получить доступ к галерее или сделать снимок для загрузки, поэтому любые дальнейшие советы будут оценены!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...