My app crashes on lenevo yoga 900 while sending sms android? - android

I am working on a tablet android app but it crashes while sending sms using smsManager. I have added permissions in manifest and tablet have telephony service too. see my log cat error
java.lang.SecurityException:
null from uid 10412 not allowed to perform SEND_SMS
08-26 15:33:36.370 24856-24856/test.in.smarttab E/AndroidRuntime:
at android.os.Parcel.readException(Parcel.java:1472)
08-26 15:33:36.370 24856-24856/test.in.smarttab E/AndroidRuntime:
at android.os.Parcel.readException(Parcel.java:1426)
08-26 15:33:36.370 24856-24856/test.in.smarttab E/AndroidRuntime:
at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:485)
This is my manifest code
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="Package_name">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.truiton.mapfragment.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="#style/Theme.AppCompat.Light.NoActionBar.FullScreen">
<receiver
android:name=".BootUpReceiver"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name=".AlarmReceiver"/>
<service android:name=".Service.AlarmService"/>
<service android:name=".location.LocationService" />
<activity
android:name=".welcomeScreen.WelcomeActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--
The API key for Google Maps-based APIs is defined as a string resource.
(See the file "res/values/google_maps_api.xml").
Note that the API key is linked to the encryption key used to sign the APK.
You need a different API key for each encryption key, including the release key that is used to
sign the APK for publishing.
You can define the keys for the debug and release targets in src/debug/ and src/release/.
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="#string/google_maps_key" />
</application>
</manifest>

Add Permission for sending sms in manifest file
<uses-permission android:name="android.permission.SEND_SMS" />

Related

Google Play - Zero supported Devices, Not able to find app

I have published an app in google play - Smart Eye - Intrusion Catch
The problem however is developer console shows zero supported devices. I am able to search my app in laptop but when searching through any android mobile device i am not able to find my app.
My manifest file look like this -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.click.rollingstone.click2" >
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera2.full" />
<uses-permission android:name="android.permission.camera" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<!-- To access Google+ APIs: -->
<uses-permission android:name="android.permission.INTERNET" />
<!--
To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. This disconnect
option is required to comply with the Google+ Sign-In developer policies
-->
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> <!-- To retrieve the account name (email) as part of sign-in: -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<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" />
<application
android:allowBackup="true"
android:icon="#mipmap/eye"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<receiver
android:name=".Click2AdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="#xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.ACTION_PASSWORD_CHANGED" />
<action android:name="android.app.action.ACTION_PASSWORD_FAILED" />
<action android:name="android.app.action.ACTION_PASSWORD_SUCCEEDED" />
</intent-filter>
</receiver>
<receiver android:name=".MailManager" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".CameraView"
android:label="#string/app_name" >
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
<activity
android:name=".AppInfo"
android:label="#string/title_activity_app_info" >
</activity>
</application>
</manifest>
Any ideas on what is happening wrong here. Thanks in advance
The line
<uses-feature android:name="android.hardware.camera2.full" />
is wrong - the feature name you might be looking for is "android.hardware.camera.level.full".
That said, do you need the capabilities of a FULL-level camera device (see docs for this here)?
It means you want full support of the new camera2 API, with 30fps full-resolution capture, etc.
If you don't need this, then just remove this uses-feature line, or add android:required="false" to the line and fix the feature name.
You are declaring via the uses-feature elements that you only run on devices that have all of the following:
android.hardware.camera
android.hardware.camera.autofocus
android.hardware.camera2.full
camera2 is an API, and not a feature to be declared in the manifest, so you are declaring you must have something that no devices have. Remove this line.
I guess its for permission. There are many permissions.
Try remove unusable ones it will help. May be there are some permissions which not supported by any device play store checks and don't show any device

No internet access in signed APK

I was working on an app that was working fine in the Debug build version and then I created a signed APK using keystore , and then with Android Studio --> Generate SIgned APK.
When I install the signed APK manually by downloading on to my phone, it asks for all permissions including internet access. However post installation, app starts but none of the server calls / API calls are working. The phone has internet connection though (webpages open up in browser)
My android manifest is :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.gmspartners.earthmiles" >
<!-- To access Google+ APIs: -->
<uses-permission android:name="android.permission.INTERNET" />
<!--
To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. This disconnect
option is required to comply with the Google+ Sign-In developer policies
-->
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<!-- To retrieve the account name (email) as part of sign-in: -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<!-- Recommended by us and most bundled integrations. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- Allow you to get LOGCAT information when a crash occurs. -->
<uses-permission android:name="android.permission.READ_LOGS"/>
<!-- Allow you to see which activity was active when a crash occurs. -->
<uses-permission android:name="android.permission.GET_TASKS"/>
<!-- Allows location to be tracked -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- Required by leanplum (and for push notifications) -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<!-- End segment io recommended permissions -->
<permission
android:name="com.gmspartners.earthmiles.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.gmspartners.earthmiles.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:name="com.gmspartners.earthmiles.globalstate.App"
android:allowBackup="true"
android:label="#string/app_name"
android:icon="#drawable/earthmiles_logo_green"
android:logo="#drawable/earthmiles_logo_white_actionbar"
android:screenOrientation="portrait"
android:theme="#style/Theme.Emgreen_actionbar"
tools:replace="android:icon" >
<activity
android:name="com.gmspartners.earthmiles.views.MainActivity_"
android:label="#string/app_name"
android:screenOrientation="portrait">
</activity>
<activity
android:name="com.gmspartners.earthmiles.views.ActivityLanding_"
android:label="#string/app_name"
android:screenOrientation="portrait"
android:theme="#android:style/Theme.NoTitleBar.Fullscreen"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.gmspartners.earthmiles.views.ActivitySignIn_"
android:label="#string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden|screenSize"
android:windowSoftInputMode="adjustPan"
/>
<receiver
android:name="com.gmspartners.earthmiles.pushnotification.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.earthmileslftr.earthmiles" />
</intent-filter>
</receiver>
<service android:name="com.gmspartners.earthmiles.pushnotification.GCMNotificationIntentService" />
</application>
</manifest>
In my case I found this error on LogCat
Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
So I checked the server certificates in this web to see what happens: https://www.ssllabs.com/ssltest
So should be a server problem

Android App is not visible on Google Play store for tablets

Can anyone suggest me why this app is not visible for tablets on google play store.
I am using GCM, Gmap, Camera and storing files on sdcard.
It is not visible for major tablets on google play store, sim and simless.
I do know that google play store mask app from device which not match with manifest permissions however I believe that there no any permission which is not exist on major samsung devices.
Please find below manifest.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
android:versionCode="15"
android:versionName="2.4.3" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="19" />
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="false"
android:xlargeScreens="true" />
<!-- GOOGLE CLOUD MESSAGING SECION -->
<permission
android:name="com.example.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!-- GCM connects to Google Services. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- END GOOGLE CLOUD MESSAGING SECION -->
<permission android:name="com.example.app.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.example.app.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Required OpenGL ES 2.0. for Maps V2 -->
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="false"
android:allowClearUserData="false"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:largeHeap="true"
android:theme="#style/AppTheme" >
<!-- GOOGLE CLOUD MESSAGING SECION -->
<receiver
android:name="com.example.app.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.app" />
</intent-filter>
</receiver>
<service
android:name="com.example.app.GCMRegistrationService"
android:enabled="true"
android:exported="false" />
<!-- END GOOGLE CLOUD MESSAGING SECTION -->
<activity
android:name=".SplashActivity"
android:screenOrientation="landscape"
android:theme="#android:style/Theme.Black.NoTitleBar"
android:windowSoftInputMode="adjustPan" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
</application>
If the Tablet android version below
android:minSdkVersion="11"
Then Google playstore .will not show app in the tablet

android play store is filtering my app from tablets, possibly other devices

I have several versions of an app live on Play, and I'm getting feedback that they don't appear on tablets. I've seen this and this and this, but as you can see they don't seem to apply. I explicitly support all screens and mark telephony as non-required, and I don't use copy protection since my app is free to end users. Can anyone see a problem?
My manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="12.0" package="com.example.app">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11"/>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<permission android:name="com.example.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM connects to Google Services. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- So that tablets, without telephony will not be filtered out by the market. -->
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application android:name="com.example.app.Application"
android:icon="#drawable/icon" android:label="#string/app_name">
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example" />
</intent-filter>
</receiver>
<service android:name="com.example.app.GCMIntentService" />
<activity android:name="com.example.app.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.app.NavigationActivity" android:label="#string/app_name" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
<activity android:name="com.example.app.MainActivity"></activity>
</application>
</manifest>
You have included CALL_PHONE permission. Most tablets do not provide this feature and will most likely have them filtered out.
See here for additional info/ideas
android.permission.CALL_PHONE for tablets
After further investigation, it looks like the few users who couldn't find an app were looking for older apps (without
<uses-feature android:name="android.hardware.telephony" android:required="false"></uses-feature>
in the manifest). The new apps seem to be fine. Thanks for the responses.

c2dm returns Application Id as null

I am new to android, i am having issue in implementing push notification.
As stated in a tutorial I read, i registered in c2dm and got Auth token, then registered in UrbanAirShip, with package xxxx, got app key and secret.
My project team used API 2.1 initially, at that time i got AppId through helium transport, both in device and in emulator.
Then we changed API into 2.2, at that time i again registered in c2dm with another sender id, got Auth token, and also again registered in UrbanAirShip with new account,
got key and secret.
For first few tries through c2dm transport, i got AppId, then i got only null, both in device and in emulator with errors as showed below,
I don't know what gone wrong, whether change in API level, or multiple sender id registration in c2dm, or multiple registration in UrbanAirShip for same package name or So many uninstalls.
I have added Manifest file and Application's oncreate method , please guide me to get back AppId.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxxx"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="com.android.vending.BILLING" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- REQUIRED for C2DM -->
<!-- Only this application can receive the messages and registration result -->
<permission android:name="xxxx" android:protectionLevel="signature" />
<uses-permission android:name="xxxx.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true" />
<uses-sdk
android:minSdkVersion="4"
android:targetSdkVersion="10" />
<application
android:icon="#drawable/logo"
android:label="#string/app_name"
android:name="xx"
android:debuggable="true"
android:allowClearUserData="true"
android:enabled="true" >
<activity
android:label="#string/app_name"
android:name=".activities.SplashActivity"
android:screenOrientation="portrait" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
....
<!-- REQUIRED -->
<receiver android:name="com.urbanairship.CoreReceiver">
<!-- REQUIRED IntentFilter - For Helium and Hybrid -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
</intent-filter>
</receiver>
<!-- REQUIRED for C2DM and Hybrid -->
<receiver android:name="com.urbanairship.push.c2dm.C2DMPushReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<!-- Receive the actual message -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="xxxx" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="xxxx" />
</intent-filter>
</receiver>
<!-- REQUIRED -->
<!-- The 'android:process' parameter is optional. Set it to a value starting
with a colon (:) to make it run in a separate,
private process -->
<service android:name="com.urbanairship.push.PushService"
android:process=":com.urbanairship.push.process"/>
<!-- OPTIONAL, if you want to receive push, push opened and registration completed intents -->
<receiver android:name="xxx.push_notifications.IntentReceiver" />
<service android:name="xxx.inapp.BillingService" />
<receiver android:name="xxx.inapp.BillingReceiver" >
<intent-filter >
<action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
<action android:name="com.android.vending.billing.RESPONSE_CODE" />
<action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
The problem arises when you run in an emulator. You need to run it in device (and Gmail account should be setup - Else you get an error). Also, it should be 2.2+. Push is only supported on 2.2+ devices. Change the minSDK version to 2.2 and try it in device. It will work.
You need to make sure you are using the "google api" version of the SDK you want, and also to have a valid google account which is market enabled. This is a requirement for c2dm.

Categories

Resources