I'm new to Android developing and I'm facing a strange issue:
I published my app on google play with a minimum api level of 18 (android 4.4).
I tested my app with many android version and run fine except one device.
A Chinese smartphone (cubot P9) running android 4.5.5 don't see the app at all in the google play.
Despite of the android version should be compatible the play store mark the app as incompatible.
I can't believe the phone report a fake android version?
Can anyone give me an explanation?
The manifest file:
...
<uses-permission android:name="android.permission.INTERNET" />
<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 android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<application
android:name=".Global"
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".FirebaseIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".GPS_Service"
android:process=":myGPS_service" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="mynotificationchannel" />
<activity android:name=".VisualizzaImmagine"></activity>
<activity android:name=".ShowInNewActivity"></activity>
</application>
...
I'd suggest to double check the versions declared in the manifest, for instance I didn't find a android:minSdkVersion in the attached manifest.
Also revise the phone capabilities, maybe your app requires some features such as screen density or specific hardware that are not available on the device.
Also if you have access to real device, you can develop a simple app to log/display the Android OS version:
Log.v("OS Version",String.valueOf(android.os.Build.VERSION.SDK_INT));
and check if it's really supported by your app, you can verify that also from this table:
https://developer.android.com/reference/android/os/Build.VERSION_CODES.html
Related
I am developing an Android app. In my app, I am testing my app running on both device and emulator. This is my third android app development. When I developed other apps, app is automatically installed with launch icon on device or on emulator. But when I run my currently developing app, it is successfully run on both emulator or device.
But app is not installed with launch icon. I did not modify and settings to Android Studio. I am using Android Studio version 1.4. Now I need to check the launch icon and other related things. But I cannot check it, because I cannot see launch icon installed.
What is the possible error? How can I make my app installed with launch icon once I run it?
This is my manifest file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.blog.waiyanhein.mmfashion.mmfashion" >
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name="com.blog.waiyanhein.mmfashion.model.Config"
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:largeHeap="true"
android:theme="#style/AppTheme" >
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="#string/facebook_app_id"/>
<activity android:name=".InitialActivity"
android:exported="true"
android:label="#string/app_name"
android:theme="#style/AppTheme.NoActionBar">
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</activity>
</application>
</manifest>
The tags to make an activity, a launcher activity should be inside intent-filter tag. You missed that. The correct way should be:
<activity android:name=".InitialActivity"
android:exported="true"
android:label="#string/app_name"
android:theme="#style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
I have uploaded an App on Google Play Store. I able to download it in mobile phone but it is not available for Tablets.
When i try to download it in Tablet its shows an error something like "This app is only design for phones"
Please help me.. what have i done wrong??
Here is my AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.AnTim.mediteam"
android:versionCode="3"
android:versionName="1.2" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
android:name="com.AnTim.mediteam.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.AnTim.mediteam.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name="com.AnTim.mediteam.Controller"
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="com.AnTim.mediteam.MainActivity"
android:configChanges="orientation|keyboardHidden"
android:label="#string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="com.idrivecare.familypro" />
</intent-filter>
</activity>
<activity
android:name="com.AnTim.mediteam.Internet_connection"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Internet"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Preference"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.GuestMenu"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Privacy"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Terms"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Forgot_password"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Registration"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Sucessfull_register"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Patient_menu"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Web"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<activity
android:name="com.AnTim.mediteam.Best_doctor"
android:label="#string/app_name"
android:screenOrientation="portrait" >
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.AnTim.mediteam" />
</intent-filter>
</receiver>
<service android:name="com.AnTim.mediteam.GCMIntentService" />
</application>
According to this:
http://arstechnica.com/gadgets/2013/11/google-play-rolls-out-designed-for-phones-tag-of-shame-on-tablets/
"Apps that don't include certain tablet enhancements will display a "designed for phones" tag on the tablet version of the Play Store, making users with tablets less likely to install them."
I guess this is the reason why you get this message. You probably didn't include those "tablet enhancements"
Your app uses feature "android.hardware.telephony". If the tablet doesn't have the dialer and a data network the app will not be compatible in that device.
I know I'm slightly late, but better late than never.
As suggested by #SauravGhimire it was the telephony access that broke compatibility.
This would be true if required = true. However, your code specifies required = false:
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
This shows that the app uses telephony on compatible devices, and on devices that doesn't have telephony access, your app has something set up that doesn't use telephony on unsupported devices. This would mean you maintain support for tablets.
The screen sizes supported would help Google Play see that you have added support somehow for tablets. AFAIK, declaring that tag and not adding special layouts doesn't show designed for tablets, nor does it show designed for phones. This is the point where your app supports both phones and tablets, but isn't specifically designed to take advantage of the extra room on tablets.
As #Hans1984 said, you may not receive installs if your app gets a "designed for phones label".
Not sure how this worked in 2015, but now you can download apps even if they are designed for phones. The "designed for phones" tag is just a way that tablet users can be "warned" that this app may not be as good on a tablet as on a phone.
I have downloaded "designed for phone" apps on my tablet, and I have done it on android 5, 6 and 7 without any problems. Maybe some devices have a warning like that (or some don't). Could also be a problem with the custom permission you have (com.AnTim.mediteam.permission.C2D_MESSAGE)
It is very hard to say why exactly you got the error, but you have done everything in the right way that should prevent the "designed for phones" label, and (assuming you don't have special tablet layouts) you will nto get the "designed for tablets" label either (the last label means it is also designed for tablets, that there is special support for it. There is also support for phones). Could be that an older version (beta/alpha/production (old version)) didn't support it and you tried to download too soon. Google Play needs a lot of time to process updates. Adding layouts for tablets is also a fix for this.
I try to develop an Android application to handle the notifications from other apps and send them to my laptop to notify the user. I use the AccessibilityService to handle the notifications on devices with Android < 4.3 (API Level 18) and the NotificationListenerService for devices with android >= 4.3.
There are no issues getting the notifications on my only android device (Samsung Galaxy S with Android 2.3.3), but I need to activate the App in the accessibility settings.
Now I tried to debug the app on my Kindle Fire (API Level 17) and my apps Activity works fine, but the app is not listed in the accessibility settings of the device. The Amazon App testing service returns no problem, so I dont know where I should search the problem.
Is it possible to use the AccessibilityService on the Kindle Fire?
Here is my android manifest file:
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18"
/>
<application
android:icon="#drawable/ic_launcher"
android:allowBackup="true">
<activity
android:name="de.test.notificationdistributor.SettingsActivity"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="de.test.notificationdistributor.NotificationDistributorService">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<service
android:name="de.test.notificationdistributor.NotificationDistributionDeprService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
</application>
You must add the permission android.permission.BIND_ACCESSIBILITY_SERVICE (added in API 16 - android 4.1)
<service
android:name="de.test.notificationdistributor.NotificationDistributorService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<meta-data android:name="android.accessibilityservice" android:resource="#xml/accessibilityservice" />
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
In the doc http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
Additionally an accessibility service must request the BIND_ACCESSIBILITY_SERVICE permission to ensure that only the system can bind to it. Failure to declare this intent will cause the system to ignore the accessibility service.
I've just gotten my google maps application to not crash on startup, but now, when it opens, it just shows a grey/white background and buttons for zooming. I searched the web and I found that this may be a problem with my API-key, so I got a new key from google, but this didn't work either.
Here's a screenshot of how it looks.
link to image (I'm a new user, so I couldn't post a picture here)
Here's my manifest file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidbasic12"
android:versionCode="1"
android:versionName="1.0"
>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
<permission
android:name="come.example.androidbasics12.permission.MAPS_RECIEVE"
android:protectionLevel="signature"/>
<uses-permission
android:name="com.example.androidbasics12.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="#drawable/new_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<!-- First xml to be loaded -->
<activity
android:name="com.example.androidbasic12.MainActivity"
android:label="#string/app_name"
android:launchMode="singleInstance"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Opens main menu after splash has loaded -->
<activity
android:name=".myMenu"
android:label="#string/app_name"
android:screenOrientation="portrait"> >
<intent-filter>
<action android:name="com.example.androidbasic12.CLEARSCREEN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- Opens test -->
<activity
android:name=".tutOne"
android:label="#string/app_name"
android:screenOrientation="portrait"> >
<intent-filter>
<action android:name="com.example.androidbasic12.TUTONE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- Opens map page -->
<activity
android:name=".map"
android:label="#string/app_name"
android:screenOrientation="portrait"> >
<intent-filter>
<action android:name="com.example.androidbasic12.MAPS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBcMOBc8WVLUIRUfs0Zgap3cnhwm4dWLag"/>
</application>
</manifest>
Anyone got any tips for this?
I've got the same problem as you, everything worked ok on emulator but on the real device it was gray surface with zoom buttons.
Then I tried other devices and it works. All other phones have original (stock) firmware, only I have one with custom firmware.
lease first check that everything works fine on emulator, then check on the device with stock firmware and let us know the result.
The problem may not be with your API key, but the authorized apps in the API console. Make sure you registered the correct key(s) and package names with the Google API console. Specifically, if you are compiling and launching directly from eclipse, you are probably signing in debug mode. If so, you need to add your debug key hash + package name to the allowed applications in the API console.
I'm trying to use push notifications on Android game made in unity 3.5. These are the steps I made:
I purchased asset called EtceteraAndroid by prime31 and create urbanairship app on its portal. Then I modify airshipconfig file like this:
gcmSender = My_Proj_number here
transport = gcm
developmentAppKey = devkey
developmentAppSecret = dev secret key
productionAppKey = devkey
productionAppSecret = dev secret key (as I have no publishing account of Urban Airship)
inProduction = false
I create google Account and got GCM enabled there, copy server API key to UrbanAirship GCM API key
I've added some permissions mentioned here Using GCM, Urban Airship to send Push Notification
Inside code, I call enable Urbanair push function which is available in EtceteraAndroid plugin.
I build and run apk on my android device.
I dont find any APPID registered on UrbanAirship portal and so get no notifications on my android device :(
Any suggestion will be appreciated.
I'm currently trying to sort out issues relating to the Urban Airship plugin as well.
According to Prime 31, it would seem like things should just work out of the box. but as you might have already noticed, GCM support has been deprecated and Prime's plugin still relies on C2DM.
Perhaps you should also post on the following forum thread as this is where discussions have been happening on this topic..
Having said that, I can get my APID to respond, even without the GCM account being correct. But I cannot receive any push notifications. More specifically, there are certain parts of the androidManifest.xml that need to be kept the same. This is my androidManifest.xml configuration:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myCompany.myGame" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<!-- The com.prime31.EtceteraApplication should be there -->
<application android:name="com.prime31.EtceteraApplication"
android:icon="#drawable/app_icon"
android:label="#string/app_name"
android:debuggable="true">
<!-- These activities should be in there -->
<activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
android:label="#string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="#string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
</activity>
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
android:label="#string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<meta-data android:name="android.app.lib_name" android:value="unity" />
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
</activity>
<activity android:name="com.unity3d.player.VideoPlayer"
android:label="#string/app_name"
android:screenOrientation="behind"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
</activity>
<!-- ACTIVITIES -->
<activity android:name="com.prime31.EtceteraProxyActivity"></activity>
<activity android:name="com.prime31.WebViewActivity" android:configChanges="orientation"></activity>
<activity android:name="com.prime31.P31VideoPlayerActivity" android:configChanges="keyboard|keyboardHidden|orientation"></activity>
<receiver android:name="com.urbanairship.CoreReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
</receiver>
<receiver android:name="com.urbanairship.push.c2dm.C2DMPushReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.myCompany.myGame" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myCompany.myGame" />
</intent-filter>
</receiver>
<service android:name="com.urbanairship.push.PushService" android:process=":com.urbanairship.push.process" />
<receiver android:name="com.prime31.P31UAIntentReceiver" />
</application>
<uses-feature android:glEsVersion="0x00010001" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<permission android:name="com.myCompany.myGame.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="com.myCompany.myGame.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
If you manage to get push notifications to work, please let me know since I can't get that part to work! Cheers!