1

DialogListener で発生する Facebook ログインの完了時に新しいアクティビティを開始したいと考えています。ログインに成功しました エラーは発生しませんが、アクティビティは開始されません。logcat が必要な場合は、メールでお知らせします。以下は私のコードです。

ここがマイ ホーム アクティビティです

package com.example.faceb;

import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.Facebook;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class HomeActivity extends Activity implements OnClickListener{
    private static final String TAG = "Facebook";
    private Button mLogin, mLogout, mShare;
    private Facebook facebook;
    private AsyncFacebookRunner abRunner;

    public boolean flag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_home);

        facebook = new Facebook("479652662068145");
        abRunner = new AsyncFacebookRunner(facebook);

        mLogin= (Button) findViewById(R.id.Login);
        mLogout= (Button) findViewById(R.id.Logout);

        mLogin.setOnClickListener(this);
        mLogout.setOnClickListener(this);     
    }

    @Override
    public void onClick(View v){
        int id = v.getId();
        switch(id){
            case R.id.Login:
                FacebookLoginDialog login = new FacebookLoginDialog(this);         
                facebook.authorize(this, login);
                if (func()==true)         
                {
                    Intent i = new Intent(this, SearchActivity.class);
                    startActivity(i);
                }
                break;
            case R.id.Logout:
                FacebookLogoutRequest logout = new FacebookLogoutRequest(this);
                abRunner.logout(this, logout);
                Toast toast = Toast.makeText(this, "You Are Logged Out", Toast.LENGTH_SHORT);
                toast.show();
                break;
            default:
                break;
        }
    }

    public static boolean func() {
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_home, menu);
        return true;
    }
}

そして、私の FacebookLoginDialog クラスに続いて

public class FacebookLoginDialog implements DialogListener{
    @Override
    public void onComplete(Bundle values) {
        HomeActivity.func();
    }

    @Override
    public void onFacebookError(FacebookError e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onError(DialogError e) {
        // TODO Auto-generated method stub  
    }

    @Override
    public void onCancel() {
        // TODO Auto-generated method stub  
    }
}

このダイアログは、 my にあるボタンのクリックで開始されますHomeActivity。たくさん検索して試してみましたが、この問題を解決できませんでした。

4

4 に答える 4

1

onCompleteでgetApplicationContextを使用してコンテキストを取得すると、問題が解決されます。コードは次のようになります

Intent i = new Intent(getApplicationContext(), SearchActivity.class);
    context.startActivity(i);

私はそれをチェックしました、それはうまくいきます...

if(access_token != null) {
                    facebook.setAccessToken(access_token);
                }
                if(expires != 0) {
                    facebook.setAccessExpires(expires);
                }

                //if(!facebook.isSessionValid()) {

                facebook.authorize((Activity) ctx, new String[] {"publish_stream"}, new DialogListener() {
                    public void onComplete(Bundle values) {
                        SharedPreferences.Editor editor = mPrefs.edit();
                        editor.putString("access_token", facebook.getAccessToken());
                        editor.putLong("access_expires", facebook.getAccessExpires());
                        editor.commit();

                        Toast.makeText(getApplicationContext(), "Posting To Your Wall !", Toast.LENGTH_SHORT).show();

                        Log.d("Graph Api", "Posting To Wall");
                        try {
                            Bitmap bitmap = BitmapFactory.decodeResource(ctx.getResources(),
                                R.drawable.icon);
                            ByteArrayOutputStream stream = new ByteArrayOutputStream();
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                            byte[] bitMapData = stream.toByteArray();

                            String response = facebook.request("me");
                            Bundle parameters = new Bundle();
                            parameters.putString("message", "" + edt.getText().toString() + "...");
                            parameters.putByteArray("picture", bitMapData);
                            response = facebook.request("photos", parameters, 
                                    "POST");
                            Log.d("Tests", "got response: " + response);
                            if (response == null || response.equals("") || 
                                    response.equals("false")) {
                               Log.v("Post Error", "Error Occured While Posting in Facebook");
                               Toast.makeText(getApplicationContext(), "Error Occured While Posting in Facebook !", Toast.LENGTH_SHORT).show();

                            }
                            else {
                                Log.v("Post Success", "Posting Succesful in Facebook");
                                Toast.makeText(getApplicationContext(), "Posting Succesful in Facebook !", Toast.LENGTH_SHORT).show();
                                edt.setText("");
                            }

                        } catch(Exception e) {
                            e.printStackTrace();
                        }

                    }

                    public void onFacebookError(FacebookError error) {
                        Toast.makeText(getApplicationContext(), "Error Occured While Authenticating in Facebook !", Toast.LENGTH_SHORT).show();
                        Log.v("FaceBook Error", ""+error);                      
                    }

                    public void onError(DialogError e) {
                        Toast.makeText(getApplicationContext(), "DiaLogError Occured While Authenticating in Facebook !", Toast.LENGTH_SHORT).show();
                        Log.v("DialogError","" + e);
                    }

                    public void onCancel() {
                        Toast.makeText(getApplicationContext(), "You Have Canceled !", Toast.LENGTH_SHORT).show();
                    }
                });
                //}
            }
于 2012-10-03T10:05:12.050 に答える
1

ボタンクリックでダイアログを開始する代わりに、ログイン後に開始したいアクティビティを開始できると思います。onCreate()次に、新しいアクティビティの内部でダイアログを呼び出します。ダイアログを閉じるだけでonComplete()、自動的に新しい画面が表示されます。アクティビティにフラグを保持し、ログインが成功した場合にのみtrueに設定するだけです。ダイアログが閉じられた後にフラグがfalseの場合に、uが新しいアクティビティを終了できるようにします。

于 2012-10-03T09:21:25.017 に答える
1

まず、正しくログインしていますか?

次のことを試してください。

1) メソッド内のコードにコメントonComplete()を付けて、ログ メッセージを入力します。

2) できれば、3 つのパラメーターを取る authorize メソッドを使用する必要があります。facebook.authorize(context,permission[],listener)

3) 正しくログインされているか確認するためfacebook.isSessionValid() { // log a msg}

上記のブロックでメッセージを表示できる必要があります...その後、新しいアクティビティを開始します

4) また、 ur MainActivity を投稿していただければ、より適切に回答できます....

于 2012-10-03T09:45:27.637 に答える
0

非UIThreadでIntentを使用してアクティビティを起動することはできません。onComplete()でコールバック関数を使用して、ユーザーがログアウトまたはログインに成功したことを通知する必要があります。次に、コールバック関数を使用してIntentinActivityを呼び出した後。

于 2012-10-03T12:15:00.790 に答える