본 포스팅은 DroidKaigi 2017 ~ Function Introduction of Google Play Services 을 기본으로 번역하여 작성했습니다
제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.
DroidKaigi 2017
2017/03/09 (Thu.)
Taichi Sato (@syarihu)
자기 소개
Point Town
Google Sign-In API
계정 선택에 사용하는 메소드
AccountManager.newChooseAccountIntent(
Account selectedAccount,
ArrayList<Account> allowableAccounts,
String[] allowableAccountTypes,
boolean alwaysPromptForAccount,
String descriptionOverrideText,
String addAccountAuthTokenType,
String[] addAccountRequiredFeatures,
Bundle addAccountOptions)
AuthToken 취득에 사용하는 메소드
AccountManager#getAuthToken(
Account account,
String authTokenType,
Bundle options,
boolean notifyAuthFailure,
AccountManagerCallBack<Bundle> callback,
Handler handler)
샘플 앱
요컨대 이렇게 되어있으면
새롭게 허가할 필요가 없다
어느 언어에 대응하고 있는지 등을 확인하기 위해서는 SDK의 아래 디렉토리에서 확인할 수 있다
<android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib/res/
Google Sign-In API의 구현
Google Developer Console에 프로젝트가 이미 있는 경우 다음 페이지에서 google-services.json를 얻을 수 있다.
https://developers.google.com/mobile/add?platform=android
추가하려는 프로젝트가 Firebase의 경우 Firebase Console에서 google-services.json를 얻을 수 있다.
https://console.firebase.google.com/
classpath 'com.google.gms:google-services:3.0.0'
compile 'com.google.android.gms:play-services-auth:10.2.0'
가장 아래에
아래를 추가apply plugin: 'com.google.gms.google-services'
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(
GoogleSignInOptions.DEFAULT_SIGN_IN
)
.requestEmail()
.build();
mScope = new Scope("https://www.googleapis.com/auth/urlshortener");
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(
GoogleSignInOptions.DEFAULT_SIGN_IN
)
.requestScopes(mScope)
.requestEmail()
.build();
mGoogleApiClient =
new GoogleApiClient.Builder(this)
.enableAutoManage(
this /* FragmentActivity */,
this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
mGoogleApiClient.connect();
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Intent signInIntent =
Auth.GoogleSignInApi
.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
@Override
public void onActivityResult(
int requestCode,int resultCode,
Intent data) {
super.onActivityResult(requestCode,
resultCode, data);
/** GoogleSignInResult */
}
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result =
Auth.GoogleSignInApi
.getSignInResultFromIntent(data);
handleSignInResult(result);
}
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
mGoogleSignInAccount = result
.getSignInAccount();
showMessage(result.getSignInAccount()
.getEmail());
}
}
Auth.GoogleSignInApi
.signOut(mGoogleApiClient)
.setResultCallback(
// new ResultCallback
);
new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
// 로그아웃 후 처리
}
});
Auth.GoogleSignInApi
.revokeAccess(mGoogleApiClient)
.setResultCallback(
// new ResultCallback
);
new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
signOut();
}
});
GoogleAuthUtil.getToken(context, new Account(
mGoogleSignInAccount.getEmail(),
ACCOUNT_TYPE),
"oauth2:" + SHORTENER_SCOPE
);
@Override
public void onResume() {
super.onResume();
OptionalPendingResult<GoogleSignInResult> opr =
Auth.GoogleSignInApi
.silentSignIn(mGoogleApiClient);
}
if (opr.isDone()) {
GoogleSignInResult result = opr.get();
handleSignInResult(result);
}
https://github.com/syarihu/GoogleSignInTest
http://qiita.com/syarihu/items/1c67816ad926f08d76d8
Google Plus One Button
해본 것
구현 방법
dependencies {
compile "com.google.android.gms:play-services-plus:10.2.0"
}
<com.google.android.gms.plus.PlusOneButton
xmlns:plus="http://schemas.android.com/
apk/lib.com.google.android.gms.plus"
android:id="@+id/plus_one_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="8dp"
plus:annotation="inline"
plus:size="medium"/>
PlusOneButton button = (PlusOneButton) findViewById(R.id.plus_one_button);
private static final REQUEST_CODE_PLUS_ONE = 0;
// +1 버튼 초기화
button.initialize("https://play.google.com/store/apps/details?id=패키지명", REQUEST_CODE_PLUS_ONE);
implements PlusOneButton.OnPlusOneClickListener {
// +1 버튼 초기 화
button.initialize("https://play.google.com/store/apps/details?id=패키지명", this /** OnPlusOneClickListener */);
@Override
public void onPlusOneClick(Intent intent) {
// PlusOne Activity를 시작한다
startActivityForResult(intent, PLUS_ONE_BUTTON);
}
App Invites for Android
Google Santa Tracker
초대하는 쪽
송신 완료!
초대되는 쪽
아, 뭔가 친구한테서 메일 왔다
재미있어 보이니깐 설치해보자
앱 시작 후 딥 링크가 발동하여 공유된 게임을 즉시 놀 수 있다!
App Invites 흐름
초대장 송신 -> 메일 or SMS -> 초대장 수신
스토어 -> 앱 설치 -> 앱 열기 -> 딥 링크 발동 -> 앱 기동
앱을 연다 -> 딥 리이크 발동 -> 앱 기동
App Invites 구현
https://console.firebase.google.com/
classpath 'com.google.gms : google-services : 3.0.0'
compile 'com.google.firebase:firebase-core:10.2.0'
compile 'com.google.firebase:firebase-invites:10.2.0'
가장 아래에
이하를 추가apply plugin: 'com.google.gms.google-services'
public class AppInvitesActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
Intent intent = getIntent();
// Intent에 App Invites 정보가 포함되어 있는지 검사
if (AppInviteReferral.hasReferral(intent)) {
processReferralIntent(intent);
}
}
private void processReferralIntent(Intent intent) {
// 초대 ID 취득
String invitationId = AppInviteReferral.getInvitationId(intent);
// 딥 링크용 URL 취득
String deepLink = AppInviteReferral.getDeepLink(intent);
// 딥 링크 URL에 포함된 매개 변수를 사용해서
// 뭔가 처리한다
<activity android:name=
".app.ui.AppInvitesActivity">
<!-- [START deep_link_filter] -->
<intent-filter>
<!-- action, category, data -->
</intent-filter>
<!-- [END deep_link_filter] -->
</activity>
<action android:name=
"android.intent.action.VIEW"/>
<category android:name=
"android.intent.category.DEFAULT"/>
<category android:name=
"android.intent.category.BROWSABLE"/>
<data android:host="invites.syarihu.net"
android:scheme="http" />
Intent intent = new AppInviteInvitation
.IntentBuilder("액션바의 제목 부분")
.setMessage("메일 본문의 상단 부분")
.setDeepLink(Uri.parse(getString(R.string.invitation_deep_link) + "?param=hoge"))
.setGoogleAnalyticsTrackingId(GA_TRACKER_ID)
.setEmailHtmlContent("<html><body>"
+ "<h1>App Invites</h1>"
+ "<a href=\"%%APPINVITE_LINK_PLACEHOLDER%%\">Install Now!</a>"
+ "<body></html>")
.setEmailSubject("メール䛾タイトル")
.build();
startActivityForResult(intent, 0);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(
this /* FragmentActivity */,
this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
mGoogleApiClient.connect();
boolean autoLaunchDeepLink = true;
AppInvite.AppInviteApi.getInvitation(
mGoogleApiClient,
this /* Activity */,
autoLaunchDeepLink
)
boolean autoLaunchDeepLink = false;
AppInvite.AppInviteApi.getInvitation(
mGoogleApiClient,
this,
autoLaunchDeepLink
).setResultCallback(
/** ResultCallback */
);
new ResultCallback<AppInviteInvitationResult>() {
@Override
public void onResult(AppInviteInvitationResult result) {
// 여기에 직접 딥 링크를 받아
// Activity를 시작하는 처리를 적는다
}
});
효과 검증 방법
App Invites를 도입한 결과
https://github.com/google/santa-tracker-android
http://qiita.com/syarihu/items/1847a7f1caf7f71d26a4
정리
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024