В настоящее время я работаю над приложением для веб-просмотра в 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;
}
}
}
Теперь у меня есть проблема только с входными файлами, которые могут получить доступ к галерее или сделать снимок для загрузки, поэтому любые дальнейшие советы будут оценены!