우선 하이브리드 어플이라는 조건입니다만, 크게 문제는 없습니다.
안드로이드 브릿지를 사용했느냐 안했느냐의 차이입니다.
웹뷰를 셋팅해주는 부분에서
mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "GIFT");
라고 지정해주었습니다.
final class MyJavaScriptInterface {
@JavascriptInterface
public void CallGift(String data, String packageName) { //데이터 / 패키지네임
String appPackageName = packageName; //패키지네임 저장
Intent startLink = getPackageManager().getLaunchIntentForPackage(appPackageName); //인텐트로 실행할 어플 패키지
if(startLink == null) { //스타트링크가 널이면 마켓으로이동하여 앱설치
// 마켓이동
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} //앱이 설치되어있는 경우 앱을 바로 실행
catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}
overridePendingTransition(0, 0);
}
else{ //스타트링크가 널이 아니면
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
String enc_data = "";
try {
enc_data = URLEncoder.encode(data, "UTF-8");
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
intent.setData(Uri.parse("komscochak.com://?data=" + enc_data));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
moveTaskToBack(true);
String return_data = "";
}
}
}
우선 CallGift라는 메소드는 웹에서 호출을 합니다. 안드로이드 자체에서 사용하지 않습니다.
웹에서 호출하기위해 만들어놓은 메소드입니다.
때문에 @JavascriptInterface를 붙여주었습니다.
이 소스에서는 파라미터값으로 웹에서 해당 데이터와 실행할 어플의 패키지이름을 입력해줍니다.
여기서 자동으로 설치가 됬으면 실행하지만, 설치가 안됬다면 플레이스토어로 이동하여 설치합니다.
이후 상품권 결제 후 결제완료 여부의 데이터를 받아야합니다.
우선 intent scheme를 생성해줘야 합니다.
스키마는 저희가 intent로 전화를 실행할때도 tel://이라는걸 실행하는것처럼
그것을 만들어주는 것입니다.
메니페스트에 스키마를 생성해주었습니다.
<activity
android:name=".GiftCardReturn"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="adjustUnspecified|adjustPan">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="스키마이름.com" />
</intent-filter>
</activity>
위의 name에는 해당 스키마이름을 입력시 어디 클래스로 이동할것인지 적어줍니다.
public class GiftCardReturn extends Activity {
final private int REQUEST_CODE = 1004;
public static int GiftCheck = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
Intent intent = getIntent();
final Uri uri = intent.getData();
final String data = uri.getQueryParameter("data"); //결제완료여부 데이터를 받는곳
Intent Main_intent = new Intent(getApplicationContext(),MainActivity.class);
GiftCheck = 1;
Main_intent.putExtra("data",data);
startActivityForResult(Main_intent,REQUEST_CODE);
Toast.makeText(getApplicationContext(), "결제가 완료되었습니다.", Toast.LENGTH_SHORT).show();
finish();
}
}
이제 결제가 완료가 된다면 스키마에 따라 이 클래스로 올것입니다.
여기서 중요한건 상속이 AppCompatActivity이 아니라 Activity라는 것입니다.
AppCompatActivity로 상속받을시 에러를 뱉어내니 주의하세요.
final String data = uri.getQueryParameter("data"); 부분이 결정적으로 결제완료여부 데이터를 받아옵니다.
그 후 저는 메인으로 다시 intent로 전환해줍니다.
전환 시 putExtra로 결제완료 데이터를 메인으로 넘겨줬습니다.
if(GiftCardReturn.GiftCheck == 1){
Intent Gift_Intent = getIntent();
GiftCard_Data = Gift_Intent.getExtras().getString("data");
GiftCardReturn.GiftCheck = 0;
mWebView.loadUrl(MainURL+""+GiftCard_Data);
Log.d("Gift_data",GiftCard_Data);
}
메인에서는 이러한 코드를 작성해줍니다.
조건문이 없을시 널포인트 에러를 뱉어낼 문제가 생길수 있으니 주의해주세요.
받을 데이터가 없는데 받으려고하면 에러가 생깁니다.
이제 웹으로 다시 데이터를 보내줘야합니다.( 하이브리드 앱 )
그부분이 mWebView.loadUrl부분입니다.
보내실 주소와 + 그 뒤에 붙을 주소를 ""안에 적어주시고 +GiftCard_Data해주시면
주소와 함께 웹으로 데이터를 보내줍니다.
결정적으로 맨위의 CallGift 메소드를 웹에서 실행하기 위해서는
<input type="button" value="Giftbtn" onClick="CallGift()" />
<script type="text/javascript">
function CallGift() {
GIFT.CallGift();
}
</script>
라는 구문을 적어서 실행합니다.
앞에 대문자 GIFT는 웹뷰셋팅할때 적어주었지요. 그뒤는 메소드명을 적어주시면 됩니다.
궁금하신 사항은 댓글 남겨주세요.
'Android' 카테고리의 다른 글
안드로이드(android) 생명주기(life cycle) (0) | 2019.12.24 |
---|---|
안드로이드(android) 하이브리드 웹뷰(webview) 스크롤값 받아오기+스크롤 제어(Scroll) (0) | 2019.12.23 |
Json(제이슨) 레트로핏 통신으로 ID(아이디) 중복체크 하기. (0) | 2019.12.19 |
Acitivity(액티비티) 전환시 변수가 초기화 되는 현상 (2) | 2019.12.19 |
안드로이드 네비게이션 드로어(Navigation Drawer) 사용하기. (23) | 2019.12.08 |
댓글