How to use Google Drive SDK in Android project with hardcoded credentials
Ok, I've found solution for my problem.
Of course my app is an Android one, I dont'n want make user to log in/use any credentials to connect to my Drive, and lastly I can manipulate files using default Drive web app.
- Seps need to be taken: Create service account as in this example.
- Download private key API Access site and put it eg. in assets folder.
- Download and import these libraries:
- google-api-client-1.13.2-beta.jar
- google-api-client-android-1.13.2-beta.jar
- google-api-services-drive-v2-rev60-1.13.2-beta.jar
- google-http-client-1.13.1-beta.jar
- google-http-client-android-1.13.1-beta.jar
- google-http-client-gson-1.13.1-beta.jar
- google-http-client-jackson2-1.13.1-beta.jar
- google-oauth-client-1.13.1-beta.jar
- gson-2.1.jar
- guava-jdk5-13.0.jar
- jackson-core-2.0.5.jar
- jsr305-1.3.9.jar
-
Implement Drive service getter:
public Drive getDriveService() throws GeneralSecurityException, IOException, URISyntaxException { HttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); GoogleCredential credential = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountId(G_SERVICE_EMAIL) .setServiceAccountScopes(DriveScopes.DRIVE) .setServiceAccountPrivateKeyFromP12File(PKC_12_FILE) .build(); Drive service = new Drive.Builder(httpTransport, jsonFactory, null) .setHttpRequestInitializer(credential) .build(); return service; }
Where G_SERVICE_EMAIL is email address from API Access site and PKC_12_FILE is previously downloaded private key.
-
Allow your service to access folder from your Drive: in sharing options of the folder in Drive app allow user with email: G_SERVICE_EMAIL read/write access.
PKC FILE INTEGRATION
private File getTempPkc12File() throws IOException { InputStream pkc12Stream = getAssets().open("this-is-your-unique-hash-privatekey.p12"); File tempPkc12File = File.createTempFile("temp_pkc12_file", "p12"); OutputStream tempFileStream = new FileOutputStream(tempPkc12File); int read = 0; byte[] bytes = new byte[1024]; while ((read = pkc12Stream.read(bytes)) != -1) { tempFileStream.write(bytes, 0, read); } return tempPkc12File; }