55

新しい Android Billing v3 のドキュメントとヘルパー コードはstartIntentSenderForResult()、購入フローを開始するときに使用します。から購入フローを開始 (および結果を受け取り) したいFragment

たとえば、ドキュメントでは呼び出しを提案しています

startIntentSenderForResult(pendingIntent.getIntentSender(),
    1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
    Integer.valueOf(0));

そしてヘルパーコード呼び出し

mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,   
    mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");

を呼び出しますstartIntentSenderForResult()

問題は、呼び出し元( が存在する場所)ではなく、親で呼び出しstartIntentSenderForResult()が発生することです。onActivityResult()ActivityFragmentIabHelper

onActivityResult()親でを受け取り、でをActivity手動で呼び出すことができますが、結果を に直接返すから を呼び出す方法はありますか?onActivityResult()FragmentstartIntentSenderForResult()FragmentFragmentonActivityResult()

4

11 に答える 11

36

2 つの解決策を提案します。

1.) アクティビティに IabHelper mHelper を配置し、フラグメントから IabHelper を呼び出します。

何かのようなもの:

このソリューションを使用するには、アクティビティで IabHelper を public として宣言し、メソッドを使用して Fragment からランチャーを呼び出します。

public class MyActivity extends Activity{

    public IabHelper mHelper

    public purchaseLauncher(){

    mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,   
         mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");

   }

    /*The finished, query and consume listeners should also be implemented in here*/
}

public class FragmentActivity extends Fragment{

      MyActivity myAct = (MyActivity) getActivity();

      myAct.purchaseLauncher();

}

2.) onActivityResult で、IabHelper オブジェクトを含む適切なフラグメントを呼び出します。適切なフラグメントは、ヘルパー オブジェクトへのアクセス メソッドを持つことができます。

protected void onActivityResult(int requestCode, int resultCode,Intent data)    
{
    super.onActivityResult(requestCode, resultCode, data);

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag("YourTag");       
    if (fragment != null)
    {
        ((MyFragmentWithIabHelper)fragment).onActivityResult(requestCode, resultCode,data);
    } 
}
于 2013-01-03T01:24:47.483 に答える
2

編集: android.support.v4.app.Fragmentの下位互換バージョンが含まれるstartIntentSenderForResult()ようになったため、この回答は廃止されました。

古い答え:

サポート ライブラリ 23.2.0 の時点で、 の変更は機能しrequestCodeなくなりましFragmentActivityた。フラグメントによって行われたリクエストを追跡するようになりました。このメソッドを(に基づくコード)をFragmentActivityホストしていたに追加しました。FragmentFragmentActivity.startActivityFromFragment(Fragment, Intent, int, Bundle)

public void startIntentSenderFromFragment(Fragment fragment, IntentSender intent, int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) throws IntentSender.SendIntentException {
    if (requestCode == -1) {
        startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask, flagsValues, extraFlags);
        return;
    }

    if ((requestCode & 0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }

    try {
        Method method = FragmentActivity.class.getDeclaredMethod("allocateRequestIndex", Fragment.class);
        method.setAccessible(true);
        int requestIndex = (int) method.invoke(this, fragment);
        startIntentSenderForResult(intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), fillInIntent, flagsMask, flagsValues, extraFlags);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

これを呼び出すと、渡された人だけが呼び出しFragmentを受け onActivityResult()ます。

于 2016-02-26T18:22:16.333 に答える
2

フラグメントとデータを親アクティビティに渡し、親アクティビティの onActivityResult からフラグメントを呼び出す必要があります。

このような

断片的に:

HomeActivity activity = (HomeActivity) getActivity();
activity.purchaseLauncher(this, mHelper, productDTO.getSku(), RC_REQUEST, mPurchaseFinishedListener, PAYLOAD);

親アクティビティ:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (storeFragment != null) {
            storeFragment.onActivityResult(requestCode, resultCode, data);
        }
    }

    public void purchaseLauncher(StoreFragment storeFragment, IabHelper mHelper, String sku, int requestCode, IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener, String payload) {
        this.storeFragment = storeFragment;
        mHelper.launchPurchaseFlow(this, sku, requestCode, mPurchaseFinishedListener, payload);
    }

于 2017-04-03T11:14:44.880 に答える
1
if (requestCode == RC_REQUEST) 
{
    Intent intent = new Intent(ContainerAvtivity.this,ContainerAvtivity.class);
    startActivity(intent);
    finish();
}

RC_REQUEST購入フローの開始に使用したものと同じです

これを Activity に追加しonActivityResultます。インベントリ リスナーは、目的の結果を生成します (一時的な修正であることはわかっていますが、私にとってはうまくいきました)。

于 2014-11-21T12:08:54.527 に答える
0

super.onActivityResult()アクティビティから呼び出すよりもフラグメントでコールバックを取得したい場合。

これにより、フラグメントが呼び出されますonActivityResult()

startIntentSenderForResultそして、フラグメント コンテキストから呼び出すことを忘れないでください。

アクティビティ コンテキストを使用しないgetActivity().startIntentSenderForResult

于 2016-09-21T10:28:03.040 に答える
0

私の場合、 Activity で onActivityResult を実行しました:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);


    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }

}

フラグメントでも同じで、アプリでの課金が機能します

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);


    }
    else {
        Log.d(ITEM_SKU, "onActivityResult handled by IABUtil.");
    }

}
于 2014-05-22T08:14:10.907 に答える
-1

電話する必要があります

super.onActivityResult(requestCode, resultCode, data);

アクティビティとフラグメントの onActivityResult の先頭で、結果をフラグメントにカスケードします。

私のFragmentActivityでは、これは次のようになります

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // No action here, call super to delegate to Fragments
    super.onActivityResult(requestCode, resultCode, data);
}
于 2013-04-09T15:40:17.047 に答える