Ограничение установки .apk только на неработающих телефонах [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

8
задан N Sharma 10 August 2014 в 17:14
поделиться

4 ответа

Цитирование документации :

Поскольку система обычно масштабирует приложения, чтобы они соответствовали более крупным экранам, вам не нужно фильтровать приложение с больших экранов. Пока вы выполняете Best Practices for Screen Independence , ваше приложение должно хорошо работать на больших экранах, таких как планшеты. Однако вы можете обнаружить, что ваше приложение не может хорошо масштабироваться или, возможно, вы решили опубликовать две версии вашего приложения для разных конфигураций экрана. В этом случае вы можете использовать элемент <compatible-screens> для управления распределением вашего приложения на основе сочетаний размера экрана и плотности. Внешние службы, такие как Google Play, используют эту информацию, чтобы применить фильтрацию к вашему приложению, так что только устройства, которые имеют конфигурацию экрана, с которой вы заявляете совместимость, могут загружать ваше приложение.

Помните, что <compatible-screens> требует от вас белого списка всех размеров экрана и плотности , которые вы поддерживаете (и мы получаем новую плотность каждый год или около того), и вы ограничены классическими размерами размеров экрана (small , normal, large, xlarge). В образце документации отсутствуют некоторые плотности:

<compatible-screens>
    <!-- all small size screens -->
    <screen android:screenSize="small" android:screenDensity="ldpi" />
    <screen android:screenSize="small" android:screenDensity="mdpi" />
    <screen android:screenSize="small" android:screenDensity="hdpi" />
    <screen android:screenSize="small" android:screenDensity="xhdpi" />
    <!-- all normal size screens -->
    <screen android:screenSize="normal" android:screenDensity="ldpi" />
    <screen android:screenSize="normal" android:screenDensity="mdpi" />
    <screen android:screenSize="normal" android:screenDensity="hdpi" />
    <screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>

Вам нужно будет добавить дополнительные элементы, если они хотят поддерживать устройства tvdpi, xxhdpi и xxxhdpi.

Выставляя документацию для <compatible-screens> :

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

И помните, что маркетинговые термины, такие как «phablet», не определены, и поэтому ваше приложение может завершить доставку на некоторых устройствах, которые, по вашему мнению, являются phablet или что кто-то другой считает, что это phablet.

6
ответ дан CommonsWare 19 August 2018 в 11:28
поделиться

Альтернативой является проверка функции android.hardware.telephony

<uses-feature android:name="android.hardware.telephony" android:required="true" />

Это ограничило бы приложение телефонами. Конечно, в это будут включены phablets, но это будет (IMHO ) лучшее решение, чем когда-либо изменяющийся подход к разрешению экрана.

6
ответ дан baash05 19 August 2018 в 11:28
поделиться
  • 1
    Он не будет работать, так как некоторые планшеты поддерживают SIM-карту – N Sharma 28 June 2017 в 07:48
  • 2
    Я тестировал его в Google Play, это работает. – Amit Garg 12 July 2017 в 16:58
  • 3
    Использует ли это только установку приложения в устройствах с поддержкой SIM-карт, будь то планшет, phablet или телефоны нормального размера? – Mr. Nacho 5 January 2018 в 09:03
  • 4
    Да. нет сима, нет установки. :) Но это не требует, чтобы пользователь сказал «да», чтобы использовать свой телефон. – baash05 24 January 2018 в 06:27

Из-за высокой плотности новых устройств, таких как Nexus 5X, Nexus 6P и Samsung Galaxy S6, нам пришлось адаптировать манифест следующим образом:

<compatible-screens>
    <screen android:screenSize="small" android:screenDensity="ldpi" />
    <screen android:screenSize="small" android:screenDensity="mdpi" />
    <screen android:screenSize="small" android:screenDensity="hdpi" />
    <screen android:screenSize="small" android:screenDensity="xhdpi" />
    <screen android:screenSize="small" android:screenDensity="420" />
    <screen android:screenSize="small" android:screenDensity="480" />
    <screen android:screenSize="small" android:screenDensity="560" />
    <screen android:screenSize="small" android:screenDensity="640" />
    <screen android:screenSize="normal" android:screenDensity="ldpi" />
    <screen android:screenSize="normal" android:screenDensity="mdpi" />
    <screen android:screenSize="normal" android:screenDensity="hdpi" />
    <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    <screen android:screenSize="normal" android:screenDensity="420" />
    <screen android:screenSize="normal" android:screenDensity="480" />
    <screen android:screenSize="normal" android:screenDensity="560" />
    <screen android:screenSize="normal" android:screenDensity="640" />
    <screen android:screenSize="large" android:screenDensity="ldpi" />
    <screen android:screenSize="large" android:screenDensity="mdpi" />
    <screen android:screenSize="large" android:screenDensity="hdpi" />
    <screen android:screenSize="large" android:screenDensity="xhdpi" />
    <screen android:screenSize="large" android:screenDensity="420" />
    <screen android:screenSize="large" android:screenDensity="480" />
    <screen android:screenSize="large" android:screenDensity="560" />
    <screen android:screenSize="large" android:screenDensity="640" />
</compatible-screens>
16
ответ дан Display name 19 August 2018 в 11:28
поделиться
  • 1
    – Pär Nils Amsen 11 May 2017 в 12:29
  • 2
    Является ли выше настройки рабочего очарования в магазине воспроизведения скачать? – Rahul Rastogi 25 July 2017 в 04:59

Это действительно зависит от того, что вы думаете о телефоне / phablets.

Существует официальное руководство , которое будет объяснять намного лучше меня, но по существу, вы могли бы сделать следующее, чтобы ограничить ваше приложение только мобильными устройствами.

AndroidManifest.xml

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>
0
ответ дан Simon Marquis 19 August 2018 в 11:28
поделиться
  • 1
    Это не работает для всех смартфонов, 5X, пикселей, Galaxy не сможет скачать. Я пробовал это на производстве. – Amit Garg 12 July 2017 в 14:12
Другие вопросы по тегам:

Похожие вопросы: