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
尝试在清单文件中使用 <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;
}
}
我遇到了一个问题,即该应用程序无法在某些应该得到很好支持的设备上下载,该列表没有出现在 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
尝试在清单文件中使用 <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;
}
}