Google Photos APIs의 사진 앨범
계정을 동기화하는 사람은 Android 기기에서 찍은 사진이 자동으로 Google의 Photos 서버에 백업된다고 생각합니다.
Google Photos APIs 가 공개되어 Google Photos 서버에서 직접 이미지를 얻을 수 있게 되었기 때문에, 이것을 이용해 포토 앨범을 만들려고 생각한 것이 본 기사의 계기입니다.
소개
이 기사에서는 Google Photos APIs을 사용하여 사진 앨범을 표시하는 웹 앱 (Spring-boot)을 만듭니다.
소스는, Git 에 들고 있습니다.
아래 그림과 같이 지정 기간 범위 내에 찍은 이미지를 지정된 간격으로 재생하도록 구현하고 있습니다.
범위
· Google Photos APIs 활성화
· 인증 정보 취득
· 포토 앨범 웹 앱 개발
Google Photos APIs 사용
공식 안내 Enable the API에 따르면, 3step정도로 활성화할 수 있습니다.
자격 증명 얻기
이쪽도 공식 안내 Request an OAuth 2.0 client ID 를 알기 쉽고, 이쪽을 참조하면 간단하게 할 수 있습니다.
샘플의 소스에서는, 이하 설정으로 하고 있습니다.
[Name]: OAuth client
[Authorized JavaScript origins]: http://localhost:8081
[Authorized redirect URIs]: http://localhost:8081/Callback
설정이 완료되면 생성한 OAuth 2.0 Client IDs의 다운로드 버튼에서 인증 파일을 가져옵니다.
웹 서버가 Google Photos APIs을 사용할 때 필요합니다.
포토앨범 웹앱 개발
인증
PhotosLibraryClientFactory.java
public static PhotosLibraryClient Client;
// ユーザーに手動で認証してもらうURL
public static String AuthUrl;
// [本記事]-[認証情報の取得]でダウンロードした認証ファイルのパス
public String mCredentialsPath;
public PhotosLibraryClientFactory(String credentialsPath) {
this.mCredentialsPath = credentialsPath;
}
public boolean init() throws IOException, GeneralSecurityException {
if(Client != null) return true;
Credentials credentials = getUserCredentials();
if(credentials == null) return false;
PhotosLibrarySettings settings = PhotosLibrarySettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credentials))
.build();
Client = PhotosLibraryClient.initialize(settings);
return true;
}
private Credentials getUserCredentials() throws IOException, GeneralSecurityException {
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(new FileInputStream(this.mCredentialsPath)));
String clientId = clientSecrets.getDetails().getClientId();
String clientSecret = clientSecrets.getDetails().getClientSecret();
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JSON_FACTORY,
clientSecrets,
ImmutableList.of("https://www.googleapis.com/auth/photoslibrary.readonly")
)
.setDataStoreFactory(new FileDataStoreFactory(DATA_STORE_DIR))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(LOCAL_RECEIVER_PORT).build();
Credential credential = flow.loadCredential("user");
if (credential != null && (
credential.getRefreshToken() != null ||
credential.getExpiresInSeconds() == null ||
credential.getExpiresInSeconds() > 60)) {
// 認証成功した場合は認証情報を返す
return UserCredentials.newBuilder()
.setClientId(clientId)
.setClientSecret(clientSecret)
.setRefreshToken(credential.getRefreshToken())
.build();
}
// 手動で認証が必要な場合は、認証URLを取得する
String redirectUri = receiver.getRedirectUri();
AuthorizationCodeRequestUrl authorizationUrl = flow.newAuthorizationUrl().setRedirectUri(redirectUri);
AuthUrl = authorizationUrl.build();
return null;
}
수동 인증이 필요한 경우 AuthUrl에 인증 URL을 설정하는 것입니다.
이쪽은 UI측에서 한번 열어, 유저에게 수작업으로 인증 작업을 실시해 받을 필요가 있습니다.
이미지 URL 가져오기
PhotosLibraryClientFactory.java
public static java.util.Date StartDate;
public static java.util.Date EndDate;
public Iterable<MediaItem> getPhotos() throws IOException, GeneralSecurityException {
if(!init()) return null;
Builder builder = SearchMediaItemsRequest.newBuilder();
if(StartDate != null && EndDate != null) {
DateFilter dateFilter = DateFilter.newBuilder().addRanges(DateRange.newBuilder()
.setStartDate(CommonUtils.convertToGoogleDate(StartDate))
.setEndDate(CommonUtils.convertToGoogleDate(EndDate)).build()).build();
Filters filter = Filters.newBuilder().setDateFilter(dateFilter).build();
builder.setFilters(filter);
}
SearchMediaItemsRequest request = builder.build();
SearchMediaItemsResponse response = PhotosLibraryClientFactory.Client.searchMediaItemsCallable().call(request);
return response.getMediaItemsList();
}
StartDate 또는 EndDate가 지정되면 지정된 기간에 찍은 사진을 검색합니다.
지정되어 있지 않은 경우는 검색 조건 없음이 됩니다만 「이 앨범의 화상을 취득」과 같은 검색의 방법도 가능하므로, 좋아하는 검색 로직을 짜면 좋다고 생각합니다.
Reference
이 문제에 관하여(Google Photos APIs의 사진 앨범), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RioAki/items/b5bb1b482da1b95536ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)