Reputation: 3789
I am new to android and working on a project where I see that the API key that I got is saved in gradle.properties
as :
MyOpenWeatherMapApiKey="1c3ae96f93a0094e8a7chsjdgfid04aed3f10"
And then in build.gradle(module:app)
I am adding the following lines :
buildTypes.each {
it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', MyOpenWeatherMapApiKey
}
So, in my main program I am accessing the data using this api whose URL is got by this piece of code :
final String FORECAST_BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?";
final String QUERY_PARAM = "q";
final String FORMAT_PARAM = "mode";
final String UNITS_PARAM = "units";
final String DAYS_PARAM = "cnt";
final String APPID_PARAM = "APPID";
Uri builtUri = Uri.parse(FORECAST_BASE_URL).buildUpon()
.appendQueryParameter(QUERY_PARAM, params[0])
.appendQueryParameter(FORMAT_PARAM, format)
.appendQueryParameter(UNITS_PARAM, units)
.appendQueryParameter(DAYS_PARAM, Integer.toString(numDays))
.appendQueryParameter(APPID_PARAM, BuildConfig.OPEN_WEATHER_MAP_API_KEY)
.build();
URL url = new URL(builtUri.toString());
So, my question is that why taking all the tension of doing changes to store the appid in the gradle part. Can't we access directly in the main program only ?
And the second part of my question is what is actually happening in the gradle part especially with the buildTypes.each{}
block ?
Upvotes: 47
Views: 45600
Reputation: 14382
There is a better way
First make sure both build/ and local.properties are added to your .gitignore
build/
# Local configuration file (sdk path, etc)
local.properties
Add your APIKEY xyz123 to your local.properties as follows
apiKey="xyz123"
Next add the following block to the root level of your app build.gradle
def localPropertiesFile = rootProject.file("local.properties")
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))
Add the following line to the android block of your app build.gradle
buildConfigField("String", "API_KEY", localProperties['apiKey'])
Then, we may call the BuildConfig.API_KEY constant as follows
import app.unicornapp.mobile.android.unicorn.BuildConfig
import app.unicornapp.mobile.android.unicorn.BuildConfig.API_KEY
import retrofit2.http.Query
interface StockApi {
suspend fun getListings(
@Query("apikey") apiKey: String
)
companion object {
val API_KEY = BuildConfig.API_KEY
}
}
Upvotes: 3
Reputation: 1772
Saving the API Key in gradle.properties might not be a great idea. Using the local.properties file will be more convincing. Since local.properties file will by default be added in the git ignore file, I believe this will be a great place to add the API key.
To add the API_key in local properties you can follow these two simple steps below.
Step 1
Edit your local.properties file and add below code
sdk.dir=/Users/Library/Android/sdk
API_KEY=**Your Key**
Step 2
Edit your app-level build.gradle file and add the 'buildConfigField' inside defaultConfig
as shown below.
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
buildConfigField "String", "API_KEY", "\"${properties.getProperty('API_KEY')}\""
Note that per this post you will need to add quotes for String types
Step 3
Sync your project with Gradle changes.
Step 4
Rebuild your project from Build->Rebuild Project.
All done!! Now you can access the key by calling BuildConfig.API_KEY
Upvotes: 18
Reputation: 666
Refer - Complete implementation for storing API_KEY in gradle properties to avoid uploading to Github.
https://richardroseblog.wordpress.com/2016/05/29/hiding-secret-api-keys-from-git/
Add gradle.properties
into .gitignore
file
Add line in gradle.properties
file API_KEY="CopyYourAPI_KEYhere"
Add below line in app/build.gradle
within the defaultConfig
buildConfigField("String", "API_KEY", API_KEY)
Use Key using the following statement
String API_KEY = BuildConfig.API_KEY;
Copy this wherever you need API_KEY
It will save your efforts to add and remove API_KEY while committing code in Github.
Upvotes: 51
Reputation: 40218
gradle.properties
is a local file and should not be stored under the version control, and BuildConfig
is a generated class, so it will only be created at build time. It's definitely easier to store the API key somewhere as a plain String, but then you'll have to commit it to the repo.BuildConfig
file to store some build-related constants. You can use buildConfigField
command to instruct Gradle to add custom fields into BuildConfig
. After the project is built, you can reference these constants inside your source code.Upvotes: 45