Страницы

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

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

понедельник, 24 февраля 2020 г.

N-ое количество runtime permission

#java #android #android_manifest


В Android 6 нужно получить разрешения на чтение контактов  и чтение\запись файлов.
Проблема в том что  когда я пытаюсь  сделать запрос на один из видов permission то
диалоговое окно появляеться но когда я хочу получить все сразу то ничего не происходит.
Я делаю так:

private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{
                    Manifest.permission.READ_CONTACTS, 
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            }, PERMISSIONS_REQUEST_READ_CONTACTS);
            //After this point you wait for callback in onRequestPermissionsResult(int,
String[], int[]) overriden method
}

    


Ответы

Ответ 1



Рабочий вариант для запроса сразу нескольких разрешений: final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; private boolean addPermission(List permissionsList, String permission) { if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) != PackageManager.PERMISSION_GRANTED) { permissionsList.add(permission); // Check for Rationale Option if (!ActivityCompat.shouldShowRequestPermissionRationale(RegistrationActivity.this, permission)) return false; } return true; } private void insertDummyContactWrapper() { List permissionsNeeded = new ArrayList(); final List permissionsList = new ArrayList(); if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS)) permissionsNeeded.add("READ_CONTACTS"); if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS)) permissionsNeeded.add("WRITE_CONTACTS"); if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) permissionsNeeded.add("READ_EXTERNAL_STORAGE"); if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) permissionsNeeded.add("WRITE_EXTERNAL_STORAGE"); if (permissionsList.size() > 0) { if (permissionsNeeded.size() > 0) { // Need Rationale String message = "You need to grant access to " + permissionsNeeded.get(0); for (int i = 1; i < permissionsNeeded.size(); i++) message = message + ", " + permissionsNeeded.get(i); showMessageOKCancel(message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(RegistrationActivity.this, permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); } }); return; } ActivityCompat.requestPermissions(RegistrationActivity.this, permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); return; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { Map perms = new HashMap(); // Initial perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); // Fill with results for (int i = 0; i < permissions.length; i++) perms.put(permissions[i], grantResults[i]); if (perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { // All Permissions Granted // TODO: 9/13/16 can make what you want } else { // Permission Denied Toast.makeText(RegistrationActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT) .show(); } } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { new AlertDialog.Builder(RegistrationActivity.this) .setMessage(message) .setPositiveButton("OK", okListener) .setNegativeButton("Cancel", null) .create() .show(); }

Ответ 2



Ответ уже есть, но может кому пригодится в будущем Бэст Практис по запросу рантайм пермишнов здесь Библиотечка для запроса пермишнов, может кому покажется так удобнее здесь

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

Непонятная ситуация с приложением android

#java #android #activity #android_manifest


У меня есть приложение для андроид с определенным функционалом, одной из функций
является логин при помощи retrofit, для того что-бы как-то продолжить работу с приложением
после удачной авторизации, я сделал переход на другое активити например назовем ее
seconscreen. То есть если мы вводим правильно пароль и логин то после нажатия на кнопку
переходим на второе активити. В андроид студии есть такая функция как Build APK, для
того что-бы создать файл-установщик программы. Я воспользовался данной функцией и создал
данный файл. Потом я эту программу поставил на реальное устройство для проверки его
работы, и вот что меня просто ОЧЕНЬ удивило, так это то что после установки у меня
появилось вместо одного приложения, два а именно приложение с функцией логина, где
мы можем залогинится и перейти на второй экран, и второе приложение которое состоит
только из активити SeconScreen. Я не понял в чем причина такой странной инсталяции
если честно. Может кто сталкивался с подобной ситуацией и знает в чем причина, буду
очень благодарен за помощь и содействие в решении моего вопроса.
    


Ответы

Ответ 1



У вас в манифесте несколько Activity помечены как LAUNCHER: Только для основной Activity указывайте его:

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

Почему приложение не спрашивает разрешения при установке

#java #android #android_manifest


Андроид приложение  при установке не запрашивает разрешения, указанные в манифесте.
У меня там был сервис для оповещений. И он вообще не работает. В манифесте все прописано
по всем канонам, но когда устанавливаю, пишет 


  для этого приложения не требуются специальные разрешения.


несмотря на то, что там много uses-permission. Как можно сделать так, чтобы спрашивало
при установке?
    


Ответы

Ответ 1



Начиная с версии API 23 (Android 6.0), «dangerous» разрешения нужно запрашивать в рантайме. Проверяем, есть ли нужные разрешения: if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { // Разрешение не получено } Запрашиваем разрешения: ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); Обрабатываем результат получения разрешений: @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { // При отмене предоставления разрешений, этот массив пуст if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Разрешение получено } else { // Пользователь отказался предоставлять разрешение } return; } // Обрабатываем другие разрешения } }

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

App is not indexable by Google Search в Манифесте

#java #android #android_manifest


Погуглив нашел решение на ошибку в манифесте:


  App is not indexable by Google Search; consider adding at least one
  Activity with an ACTION-VIEW intent-filler. See issue explanation for
  more details.


Нужно добавить ссылку на сайт:


        
        

        
        


Но непонятно одно что означает префикс?

android:pathPrefix="/gizmos"

    


Ответы

Ответ 1



Это значит что будут отфильтрованы не все ссылки на www.example.com, а только те у которых путь начинается с "/gizmos": http://www.example.com/gismos/bla/bla.html

Ответ 2



если нет особого желания или потребности морочиться с deeplink можно добавить в манифест строчку tools:ignore="GoogleAppIndexingWarning"

Ответ 3



Я нашёл это решение в англоязычном stackoverflow - там в шапке написано GizmosActivity - подозреваю, что это имя разработчика, и всё.

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

Как программно получить список всех разрешений (permissions) из Android Manifest

#java #android #android_manifest #manifest


В связи с тем, что с 1 ноября 2018 года обязали во всех опубликованных в Google Play
Market приложениях установить "targetSdkVersion=26", остро встает необходимость обработки
всех разрешений приложения.

В связи с этим, стало актуальным получение списка наименований всех разрешений из
Манифеста с дальнейшей их обработкой.

Подскажите какими способами это можно осуществить!?
    


Ответы

Ответ 1



Utility класс, который позволяет получать разрешения, используемые в файле манифеста public final class PermissionUtils { private PermissionUtils() { } /** * Retrieves permissions listed in the manifest file * @param context Context * @return Returns String array of permissions */ public static String[] retrievePermissions(Context context) { try { return context .getPackageManager() .getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS) .requestedPermissions; } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException("This should have never happened.", e); } } }

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

App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW intent filter

#android #android_studio #android_manifest


Что будет если на это предупреждение не реагировать вообще?
    


Ответы

Ответ 1



Вы можете создавать ссылки на приложения для Android это URL-адреса HTTP, которые приводят пользователей непосредственно к определенному контенту в приложении для Android. Ссылки на приложения для Android могут привлечь больше пользователей к вашему приложению и облегчитьим доступ к контенту внутри приложения. Для создания ссылки необходимо настроить , а потом обрабатывать входящие intent, есть несколько очень подробных статей в оф доках: https://developer.android.com/training/app-links/index.html https://developer.android.com/training/app-links/deep-linking.html Ответ: ничего не будет, кроме того что вам советует AndroidStudio. Ссылки на приложения для Android могут привлечь больше пользователей

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

Проблема с подписью apk файла

#android #android_manifest


Пытаюсь сделать подписанный apk с помощью Build->Generate Signed APK... Но не получается.
Причиной тому сия ошибка:



Причем ругается в манифесте, который генерируется при самом билде, то есть не в основном.

В основном манифесте же, конечно всё прописано, и прекрасно работает

        
        


Не совсем понятна причина ошибки. Сталкивался кто?
    


Ответы

Ответ 1



Скорее всего @string/google_maps_key" сылается на каталог который в релиз не попадает, к примеру в каталоге debug... Добавьте ссылку на ресурс в каталог проекта main или release

Как сделать так, чтобы при каждом Generate Signed APK автоматически увеличивался на единицу versionCode?

#android #android_studio #компиляция #build #android_manifest


Как сделать так, чтобы при каждом Generate Signed APK... автоматически увеличивался
на единицу versionCode, чтобы не делать это вручную,.. просто, иногда забываешь об
этом и загружаешь в Google Play Console версию со старым versionCode (что не допустимо!)

android:versionCode="X"

    


Ответы

Ответ 1



Решение 1 android { compileSdkVersion 18 buildToolsVersion "18.1.0" def versionPropsFile = file('version.properties') if (versionPropsFile.canRead()) { def Properties versionProps = new Properties() versionProps.load(new FileInputStream(versionPropsFile)) def code = versionProps['VERSION_CODE'].toInteger() + 1 versionProps['VERSION_CODE']=code.toString() versionProps.store(versionPropsFile.newWriter(), null) defaultConfig { versionCode code versionName "1.1" minSdkVersion 14 targetSdkVersion 18 } } else { throw new GradleException("Could not read version.properties!") } // rest of android block goes here } Решение 2 (использовать время) def date = new Date() def formattedDate = date.format('yyMMddHHmm') def code = formattedDate.toInteger() defaultConfig { minSdkVersion 10 targetSdkVersion 21 versionCode code }

Ответ 2



Я делаю по другому. В основе идеи лежит использование номера версии из VCS. В случае git делаем так: //извлечение порядкового номера версии стартуя от HEAD def getVersionCode = { -> try { def stdout = new ByteArrayOutputStream() exec { standardOutput = stdout commandLine 'git', 'rev-list', '--first-parent', '--count', 'master' } println("Build #"+stdout) return asInteger(stdout.toString("ASCII").trim()) } catch (Exception e) { e.printStackTrace(); return 0; } } //присваиваем версию def char[] patches='abcdefghijklmnopqrstuwxyz'.toCharArray() def patch=1 //иногда бывает нужно определить патч внутри версии def majorVersion=1 def minorVersion=0 def revision=getVersionCode() defaultConfig { //blah-blah versionName = majorVersion + '.' + minorVersion + '.' + revision + patches[patch] versionCode = 10000000*majorVersion+10000*minorVersion + 10*revision+patch } На выходе получим что-то типа: versionName="1.0.25a" versionCode="10000251" Аналогичные скрипты можно написать и для SVN Update Инкрементирование версии будет при каждом commit. Отдельно можно также писать githash с тем, чтобы потом по логам восстановить какая именно версия упала и где. Когда юзеров много, не все вовремя апгрейдят версии - крайне полезная штука скажу я вам. Несколько раз реально выручала.

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

Обновление версии Android приложения - как?

#android #android_manifest


Залил в PlayMarket приложение, доработал его, хочу залить ОБНОВЛЕНИЯ. Создал новый
APK файл программы где в манифесте указал:









При загрузке АРК файла выдает ошибку "APK-файл с кодом версии 1 уже существует. Используйте
другой код."
Как обновить?
    


Ответы

Ответ 1



Версию надо менять НЕ В МАНИФЕСТЕ а в файле build.gradle !!!!!!

Ответ 2



Вам необходимо проверить versionCode в двух местах, это build.gradle внутри модуля (приложения), и в файле манифесте этого модуля. Если в Gradle скрипте его нет то он будет Overide(переопределен) в Android manifest и копироваться оттуда. В другом случае приоритет будет конечно у Gradle, так как скрипт является сборкой и управляет Build.properties, эти данные можно получить раньше. Плохой практикой является оставлять оба параметра (как скорей всего у вас в примере), так как вам необходимо отслеживать их в 2 местах. Хорошей практикой является указать versionCode только в gradle, более того использовать build.properties для формирования данных для ui , чтоб показать системную информацию например, тогда все сведётся к единственному необходимому изменению. ----------}

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

Непонятная ситуация с приложением android

У меня есть приложение для андроид с определенным функционалом, одной из функций является логин при помощи retrofit, для того что-бы как-то продолжить работу с приложением после удачной авторизации, я сделал переход на другое активити например назовем ее seconscreen. То есть если мы вводим правильно пароль и логин то после нажатия на кнопку переходим на второе активити. В андроид студии есть такая функция как Build APK, для того что-бы создать файл-установщик программы. Я воспользовался данной функцией и создал данный файл. Потом я эту программу поставил на реальное устройство для проверки его работы, и вот что меня просто ОЧЕНЬ удивило, так это то что после установки у меня появилось вместо одного приложения, два а именно приложение с функцией логина, где мы можем залогинится и перейти на второй экран, и второе приложение которое состоит только из активити SeconScreen. Я не понял в чем причина такой странной инсталяции если честно. Может кто сталкивался с подобной ситуацией и знает в чем причина, буду очень благодарен за помощь и содействие в решении моего вопроса.


Ответ

У вас в манифесте несколько Activity помечены как LAUNCHER

Только для основной Activity указывайте его:

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

Почему приложение не спрашивает разрешения при установке

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


Ответ

Начиная с версии API 23 (Android 6.0), «dangerous» разрешения нужно запрашивать в рантайме
Проверяем, есть ли нужные разрешения:
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { // Разрешение не получено }
Запрашиваем разрешения:
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
Обрабатываем результат получения разрешений:
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// При отмене предоставления разрешений, этот массив пуст if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Разрешение получено
} else {
// Пользователь отказался предоставлять разрешение } return; }
// Обрабатываем другие разрешения } }

вторник, 15 января 2019 г.

Как программно получить список всех разрешений (permissions) из Android Manifest

В связи с тем, что с 1 ноября 2018 года обязали во всех опубликованных в Google Play Market приложениях установить "targetSdkVersion=26", остро встает необходимость обработки всех разрешений приложения.
В связи с этим, стало актуальным получение списка наименований всех разрешений из Манифеста с дальнейшей их обработкой.
Подскажите какими способами это можно осуществить!?


Ответ

Utility класс, который позволяет получать разрешения, используемые в файле манифеста
public final class PermissionUtils {
private PermissionUtils() { }
/** * Retrieves permissions listed in the manifest file * @param context Context * @return Returns String array of permissions */ public static String[] retrievePermissions(Context context) { try { return context .getPackageManager() .getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS) .requestedPermissions; } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException("This should have never happened.", e); } } }

четверг, 15 ноября 2018 г.

Проблема с подписью apk файла

Пытаюсь сделать подписанный apk с помощью Build->Generate Signed APK... Но не получается. Причиной тому сия ошибка:

Причем ругается в манифесте, который генерируется при самом билде, то есть не в основном.
В основном манифесте же, конечно всё прописано, и прекрасно работает

Не совсем понятна причина ошибки. Сталкивался кто?


Ответ

Скорее всего @string/google_maps_key" сылается на каталог который в релиз не попадает, к примеру в каталоге debug... Добавьте ссылку на ресурс в каталог проекта main или release

вторник, 13 ноября 2018 г.

Как сделать так, чтобы при каждом Generate Signed APK автоматически увеличивался на единицу versionCode?

Как сделать так, чтобы при каждом Generate Signed APK... автоматически увеличивался на единицу versionCode, чтобы не делать это вручную,.. просто, иногда забываешь об этом и загружаешь в Google Play Console версию со старым versionCode (что не допустимо!)
android:versionCode="X"


Ответ

Решение 1
android { compileSdkVersion 18 buildToolsVersion "18.1.0"
def versionPropsFile = file('version.properties')
if (versionPropsFile.canRead()) { def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def code = versionProps['VERSION_CODE'].toInteger() + 1
versionProps['VERSION_CODE']=code.toString() versionProps.store(versionPropsFile.newWriter(), null)
defaultConfig { versionCode code versionName "1.1" minSdkVersion 14 targetSdkVersion 18 } } else { throw new GradleException("Could not read version.properties!") }
// rest of android block goes here }
Решение 2 (использовать время)
def date = new Date() def formattedDate = date.format('yyMMddHHmm') def code = formattedDate.toInteger()
defaultConfig { minSdkVersion 10 targetSdkVersion 21 versionCode code }

пятница, 26 октября 2018 г.

Обновление версии Android приложения - как?

Залил в PlayMarket приложение, доработал его, хочу залить ОБНОВЛЕНИЯ. Создал новый APK файл программы где в манифесте указал:



При загрузке АРК файла выдает ошибку "APK-файл с кодом версии 1 уже существует. Используйте другой код." Как обновить?


Ответ

Версию надо менять НЕ В МАНИФЕСТЕ а в файле build.gradle !!!!!!