Android 应用程序无法在某些设备上下载

Android App Not Available For Download on Some Devices

我遇到了一个问题,即该应用程序无法在某些应该得到很好支持的设备上下载,该列表没有出现在 Google Play 中。

我通过开发控制台在 APK 的“不支持”列表中看到大约 1800 台设备。其中包括一些 Galaxy S3、S4、S5 型号(列表中有同一设备的多个变体)。大约 6577 出现在支持列表中。

我在清单中有条目以支持不同的屏幕尺寸和密度,这是我的清单部分:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.foo"
    android:versionCode="57"
    android:versionName="2.0.5" >

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19"  />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <uses-permission android:name="com.android.vending.BILLING" />

    <!-- Creating Permission to receive Google Maps -->
    <permission android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
    <!-- Permission to receive Google Maps -->
    <uses-permission android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE"/>

    <!-- Permission to read Google Services -->
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"  />

    <!-- Maps API needs OpenGL ES 2.0. -->
    <uses-feature android:glEsVersion="0x00020000" android:required="false" />

    <supports-screens
        android:anyDensity="true"
        android:resizeable="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <application
        android:name=".fooApp"
        android:hardwareAccelerated="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:theme="@style/AppBaseTheme" >

        <meta-data android:name="DATABASE" android:value="foo.db" />
        <meta-data android:name="VERSION" android:value="2" />
        <meta-data android:name="QUERY_LOG" android:value="false" />
        <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.foo" />

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="... key ..." />

        <uses-library android:name="com.google.android.maps"  />

        <activity android:name=".StatusActivity" android:screenOrientation="portrait" android:theme="@style/Theme.VPI" />
        <activity android:name=".StatusDetailsActivity" android:screenOrientation="portrait" />
        <activity android:name=".MyAlertsActivity" android:screenOrientation="portrait" />
        <activity android:name=".AlertLinesActivity" android:screenOrientation="portrait" />
        <activity android:name=".AlertDetailsActivity" android:screenOrientation="portrait" />
        <activity android:name=".PreferencesActivity" android:screenOrientation="portrait" android:theme="@style/Theme.Sherlock.Light"  />
        <activity android:name=".RouteListActivity" android:screenOrientation="portrait" android:theme="@style/Theme.VPI" />
        <activity android:name=".StopListActivity" android:screenOrientation="portrait" />
        <activity android:name=".StopTimesActivity" android:screenOrientation="portrait"/>
        <activity android:name=".UpgradeActivity" android:screenOrientation="portrait"/>
        <activity android:name=".TransfersActivity" android:screenOrientation="portrait" android:theme="@style/Theme.VPI" />
        <activity android:name=".TransfersDetailsActivity" android:screenOrientation="portrait" android:theme="@style/MyDialog" />
        <activity android:name=".MapActivity" android:theme="@style/Theme.VPI" android:configChanges="orientation|keyboardHidden" />
        <activity android:name=".TabHostActivity" android:configChanges="keyboardHidden|orientation|screenSize" />

        <activity android:name=".SplashActivity" android:screenOrientation="portrait" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".Service.NotificationService" />              

        <receiver android:name="com.foo.Receiver.MyAlarmReceiver"  />

        <receiver android:name="com.foo.Receiver.ConnectionChangedReceiver" android:exported="false">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>     

        <receiver android:name="com.foo.Receiver.BootCompletedReceiver">
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />  
            </intent-filter>  
        </receiver>

    </application>

</manifest>

被过滤的设备有:Galaxy Note Edge,以及其他一些主流设备,部分三星平板和华硕平板也被过滤掉。但是对于 Nexus 7 来说效果很好。

知道是什么原因造成的吗?

删除这个

<supports-screens
    android:smallScreens="true"
    android:normalScreens="true"
    android:largeScreens="true"
    android:xlargeScreens="true"
    android:resizeable="true" android:anyDensity="true" />

也试试添加这个

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19"
        tools:ignore="OldTargetApi" />

如果这是在 Android Studio 项目中,您需要在 app/build.gradle 文件

中设置 min/max

另一种可能性是您的尺寸、布局或可绘制对象适合特定设备 size/type 或屏幕分辨率。

首先从清单中删除以下代码

<supports-screens
    android:smallScreens="true"
    android:normalScreens="true"
    android:largeScreens="true"
    android:xlargeScreens="true"
    android:resizeable="true" 
    android:anyDensity="true" />

并检查您丢失的是哪个特定设备组,这可能是因为您丢失的是非常旧的 api 版本设备,现在人们不再使用

有关更多信息,您可以参考以下内容link

https://developer.android.com/google/play/filters.html

尝试在清单文件中使用 <uses-feature> 而不是 <uses-permission> 并为功能设置 android:required="false"..

所以替换

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<uses-permission android:name="com.android.vending.BILLING" />

<!-- Creating Permission to receive Google Maps -->
<permission android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<!-- Permission to receive Google Maps -->
<uses-permission android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE"/>

<!-- Permission to read Google Services -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"  />

<uses-feature android:name="android.permission.ACCESS_NETWORK_STATE" android:required="false" ></uses-feature >
<uses-feature android:name="android.permission.ACCESS_WIFI_STATE"  android:required="false" />

<uses-feature android:name="android.permission.INTERNET"  android:required="false" />
<uses-feature android:name="android.permission.RECEIVE_BOOT_COMPLETED"  android:required="false" />
<uses-feature  android:name="android.permission.VIBRATE" android:required="false" />
<uses-feature android:name="android.permission.READ_PHONE_STATE" android:required="false" ></uses-feature >
<uses-feature android:name="android.permission.READ_EXTERNAL_STORAGE" android:required="false" ></uses-feature >
<uses-feature android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:required="false" ></uses-feature >

<uses-feature android:name="com.android.vending.BILLING"  android:required="false" />

<!-- Creating Permission to receive Google Maps -->
<uses-feature android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE" android:protectionLevel="signature" android:required="false" />
<!-- Permission to receive Google Maps -->
<uses-feature android:name="com.foo.supportmapfragment.permission.MAPS_RECEIVE" android:required="false" />

<!-- Permission to read Google Services -->
<uses-feature android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"   android:required="false" />

检查进行此更改后应用程序是否可以在更多设备上下载..

尝试删除:

"<supports-screens
        android:anyDensity="true"
        android:resizeable="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />"

检查您是否为每种支持的语言创建了本地化版本。并在 Play 商店中添加从 4"、5"、6" and/or 平板电脑设备截取的屏幕截图。 同时将 android:targetSdkVersion 设置为 21。 这应该可以解决您的问题。

尝试使用 aapt 工具查看您的清单中存在哪些隐含功能,并通过向这些功能添加 <uses-feature android:name="FREATURE_NAME" android:required="false" /> 使其成为可选功能。 此外,通过使用以下方法检查您的应用中可选功能的可用性,确保您的应用在设备上不可用时不会中断:

protected boolean hasHardwareFeature(Context context, String feature)
{
    if (context.getPackageManager().hasSystemFeature(feature))
    {
        return true;
    }
    else
    {
        Log.i(TAG, "Device doesn't have hardware feature " + feature);
        return false;
    }
}