簡體   English   中英

單擊登錄到Twitter按鈕時強制關閉

[英]Force close when click on log in to twitter button

這是主要活動的代碼

package pidevelopers.floata;

import org.json.JSONObject;
import org.json.JSONTokener;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
import android.widget.ToggleButton;

import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;
import com.facebook.android.SessionStore;

public class MainActivity extends Activity {

    Facebook mFacebook;
    CheckBox mFacebookBtn;
    ProgressDialog mProgress;
    ToggleButton start;
    Button twitterbutton;

    String[] PERMISSIONS = new String[] { "publish_actions" };

    String APP_ID = "231620133714944";

    int isstart;
    static Twitter twitter;
    protected static final String AUTHENTICATION_URL_KEY = "AUTHENTICATION_URL_KEY";
    protected static final int LOGIN_TO_TWITTER_REQUEST = 0;

    static SharedPreferences mSharedPreferences;

    static final String PREFERENCE_NAME = "twitter_oauth";
    static final String ACCESS_TOKEN = "oauth_token";
    static final String ACCESS_SECRET = "oauth_token_secret";

    AccessToken accessToken;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFacebookBtn = (CheckBox) findViewById(R.id.cb_facebook);
        start = (ToggleButton) findViewById(R.id.start);
        twitterbutton = (Button) findViewById(R.id.twitter);

        mProgress = new ProgressDialog(this);
        mFacebook = new Facebook(APP_ID);

        SessionStore.restore(mFacebook, this);

        twitterbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                loginToTwitter();
                String token = "" + accessToken;
                Toast.makeText(getApplicationContext(), token, 500).show();
            }
        });

        if (mFacebook.isSessionValid()) {
            mFacebookBtn.setChecked(true);

            String name = SessionStore.getName(this);
            name = (name.equals("")) ? "Unknown" : name;

            mFacebookBtn.setText("  Facebook (" + name + ")");
        }

        mFacebookBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onFacebookClick();
            }
        });

        start.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if (isstart == 1) {
                    stopService(new Intent(MainActivity.this, Chathead.class));
                    isstart = 2;
                } else {
                    startService(new Intent(MainActivity.this, Chathead.class));
                    isstart = 1;
                }

            }
        });

    }

    private void onFacebookClick() {
        if (mFacebook.isSessionValid()) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("Delete current Facebook connection?")
                    .setCancelable(false)
                    .setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    fbLogout();
                                }
                            })
                    .setNegativeButton("No",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.cancel();

                                    mFacebookBtn.setChecked(true);
                                }
                            });

            final AlertDialog alert = builder.create();

            alert.show();
        } else {
            mFacebookBtn.setChecked(false);

            mFacebook.authorize(this, PERMISSIONS, -1,
                    new FbLoginDialogListener());
        }
    }

    private final class FbLoginDialogListener implements DialogListener {
        public void onComplete(Bundle values) {
            SessionStore.save(mFacebook, MainActivity.this);

            mFacebookBtn.setText("  Facebook (No Name)");
            mFacebookBtn.setChecked(true);

            getFbName();
        }

        public void onFacebookError(FacebookError error) {
            Toast.makeText(MainActivity.this, "Facebook connection failed",
                    Toast.LENGTH_SHORT).show();

            mFacebookBtn.setChecked(false);
        }

        public void onError(DialogError error) {
            Toast.makeText(MainActivity.this, "Facebook connection failed",
                    Toast.LENGTH_SHORT).show();

            mFacebookBtn.setChecked(false);
        }

        public void onCancel() {
            mFacebookBtn.setChecked(false);
        }
    }

    private void getFbName() {
        mProgress.setMessage("Finalizing ...");
        mProgress.show();

        new Thread() {
            @Override
            public void run() {
                String name = "";
                int what = 1;

                try {
                    String me = mFacebook.request("me");

                    JSONObject jsonObj = (JSONObject) new JSONTokener(me)
                            .nextValue();
                    name = jsonObj.getString("name");
                    what = 0;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                mFbHandler.sendMessage(mFbHandler.obtainMessage(what, name));
            }
        }.start();
    }

    private void fbLogout() {
        mProgress.setMessage("Disconnecting from Facebook");
        mProgress.show();

        new Thread() {
            @Override
            public void run() {
                SessionStore.clear(MainActivity.this);

                int what = 1;

                try {
                    mFacebook.logout(MainActivity.this);

                    what = 0;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                mHandler.sendMessage(mHandler.obtainMessage(what));
            }
        }.start();
    }

    private Handler mFbHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();

            if (msg.what == 0) {
                String username = (String) msg.obj;
                username = (username.equals("")) ? "No Name" : username;

                SessionStore.saveName(username, MainActivity.this);

                mFacebookBtn.setText("  Facebook (" + username + ")");

                Toast.makeText(MainActivity.this,
                        "Connected to Facebook as " + username,
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Connected to Facebook",
                        Toast.LENGTH_SHORT).show();
            }
        }
    };

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();

            if (msg.what == 1) {
                Toast.makeText(MainActivity.this, "Facebook logout failed",
                        Toast.LENGTH_SHORT).show();
            } else {
                mFacebookBtn.setChecked(false);
                mFacebookBtn.setText("  Facebook (Not connected)");

                Toast.makeText(MainActivity.this, "Disconnected from Facebook",
                        Toast.LENGTH_SHORT).show();
            }
        }
    };


    private class GetRequestTokenTask extends AsyncTask<Void, Void, Void> {


        @Override
        protected Void doInBackground(Void... voids) {
            twitter = TwitterFactory.getSingleton();

            twitter.setOAuthConsumer("UUyRw5Xq9zVUtToGQopqaDtqP","1uZcuyB5OBKFsWi1Nb8PZsxQ0VlllxT4EJvCscE7ejjs47GjGh");

            try {
                // launch login activity
                RequestToken requestToken = twitter.getOAuthRequestToken(getString(R.string.TWITTER_CALLBACK_URL));
                launchLoginWebView(requestToken);
            } catch (TwitterException e) {
                e.printStackTrace();

            }
            return null;
        }
    }

    private void loginToTwitter() {
        // starting class to get access token
        GetRequestTokenTask getRequestTokenTask = new GetRequestTokenTask();
        getRequestTokenTask.execute();
    }

    private void launchLoginWebView(RequestToken requestToken) {
        // intent to launch activity + sending request
        Intent intent = new Intent(this, Logintwitter.class);
        intent.putExtra(MainActivity.AUTHENTICATION_URL_KEY,
                requestToken.getAuthenticationURL());
        startActivityForResult(intent, LOGIN_TO_TWITTER_REQUEST);

    }

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

        if (requestCode == LOGIN_TO_TWITTER_REQUEST) {
            if (resultCode == Activity.RESULT_OK) {
                getAccessToken(data
                        .getStringExtra(Logintwitter.CALLBACK_URL_KEY));
            }
        }
    }

    private void getAccessToken(String callbackUrl) {

        Uri uri = Uri.parse(callbackUrl);
        String verifier = uri.getQueryParameter("oauth_verifier");

        GetAccessTokenTask getAccessTokenTask = new GetAccessTokenTask();
        getAccessTokenTask.execute(verifier);
    }

    private class GetAccessTokenTask extends AsyncTask<String, Void, Void> {



        @Override
        protected Void doInBackground(String... strings) {
            String verifier = strings[0];
                try {
                    accessToken = twitter.getOAuthAccessToken(verifier);
                    Log.d(MainActivity.class.getSimpleName(), accessToken.getToken());

                } catch (Exception e) {



                }

            return null;
        }



             @Override
             protected void onPostExecute(Void result){
                  mSharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE);
                  Editor editor = mSharedPreferences.edit();
                  editor.putString(ACCESS_TOKEN , accessToken.getToken());
                  editor.putString(ACCESS_SECRET, accessToken.getTokenSecret() ); 
                  editor.commit();

                  Toast.makeText(getApplicationContext(), "hola", 54).show();
                      super.onPostExecute(result);
             }



        }



}

當我單擊此按鈕時,錯誤在這里

twitterbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                loginToTwitter();
                String token = "" + accessToken;
                //Toast.makeText(getApplicationContext(), token, 500).show();
            }
        });

當我單擊此按鈕時,它強制關閉,這是日志貓

05-26 18:30:05.943: E/AndroidRuntime(10638): FATAL EXCEPTION: AsyncTask #1
05-26 18:30:05.943: E/AndroidRuntime(10638): Process: pidevelopers.floata, PID: 10638
05-26 18:30:05.943: E/AndroidRuntime(10638): java.lang.RuntimeException: An error occured while executing doInBackground()
05-26 18:30:05.943: E/AndroidRuntime(10638):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.lang.Thread.run(Thread.java:841)
05-26 18:30:05.943: E/AndroidRuntime(10638): Caused by: java.lang.NoClassDefFoundError: twitter4j.TwitterFactory
05-26 18:30:05.943: E/AndroidRuntime(10638):    at pidevelopers.floata.MainActivity$GetRequestTokenTask.doInBackground(MainActivity.java:278)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at pidevelopers.floata.MainActivity$GetRequestTokenTask.doInBackground(MainActivity.java:1)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-26 18:30:05.943: E/AndroidRuntime(10638):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-26 18:30:05.943: E/AndroidRuntime(10638):    ... 4 more

請注意,此代碼在沒有Facebook的其他項目中也可以使用

問題是當我單擊Twitter按鈕時,它強制關閉

我有同樣的問題..幾天后我發現了問題:

<activity
        android:name=".TwitterLoginActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:noHistory="true" >
</activity>

noHistory =“ true”導致Twitter登錄后強制關閉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM