0

私はアンドロイド開発に不慣れです.....2日以来、Twitterの統合で問題が発生しました.....私の知る限り、私が実装した方法は正しいです.....しかし、私がそうではない理由を見逃しました出力を取得する...最初に問題を説明します....

1.私の要件によれば、アプリケーションで Twitter の統合を行う必要があります。
2.ツイートボタンをクリックするたびに....最初に、ユーザーがログイン状態にあるかどうかを確認する必要があります。
3.ユーザーがログイン状態の場合、コメントを投稿する必要があります。4.それ以外の場合は、ログイン ページを表示し、コメントを投稿する必要があります。5. 4 より前のバージョンでは問題なく動作していましたが、それより前のバージョンでは動作せず、「NETWORK MAIN THREAD EXCEPTION」が表示されました。
6.このため、非同期タスクをコードに実装しました。
7.そこから問題が提起されました。8.Twitterにログインできませんでした.Googleでよく検索しましたが、エラーの場所が見つかりませんでした....コードをここに投稿しています.

public class sharetw extends Activity {
// Shared Preferences
private static SharedPreferences mSharedPreferences;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       setContentView(R.layout.sharetw);
            tweetbtn = (Button) findViewById(R.id.tweet);
    // Shared Preferences
mSharedPreferences = getApplicationContext().getSharedPreferences(
            "MyPref", 0);
tweetbtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            status = twtreview.getText().toString();

            // Check for blank text
            if (isTwitterLoggedInAlready() && status.trim().length() > 0) {
                new updateTwitterStatus().execute(status);
            } else if (status.equals("")) {
                // EditText is empty
                Toast.makeText(getApplicationContext(),
                        "Please enter status message", Toast.LENGTH_SHORT)
                        .show();
            } else {

                new loginToTwitter().execute(); 
        }
    });
/**
     * This if conditions is tested once is redirected from twitter page.
     * Parse the uri to get oAuth Verifier
     * */
    if (!isTwitterLoggedInAlready()) {
        Uri uri = getIntent().getData();
        if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {   // oAuth verifier
            String verifier = uri
                    .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
try {       
// Get the access token
requestToken = twitter
                        .getOAuthRequestToken(TWITTER_CALLBACK_URL);
accessToken = twitter.getOAuthAccessToken(requestToken,
                        verifier);
// Shared Preferences
Editor e = mSharedPreferences.edit();

                // After getting access token, access token secret
                // store them in application preferences
                e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                e.putString(PREF_KEY_OAUTH_SECRET,
                        accessToken.getTokenSecret());
                // Store login status - true
                e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                e.commit(); // save changes
Log.e("Twitter OAuth Token", "> " + accessToken.getToken());
// Getting user details from twitter
                // For now i am getting his name only
                long userID = accessToken.getUserId();
                User user = twitter.showUser(userID);
                username = user.getName();
e.putString("namew", "" + username);
                e.commit();
                // Displaying in xml ui
                twtconect.setText("Twitter" + "(" + username + ")" + "a");} catch (Exception e) {
                // Check log for login errors
                Toast.makeText(getApplicationContext(),
                        "Sorry!login again", Toast.LENGTH_LONG).show();
            }
        }
    }
    if (isTwitterLoggedInAlready()) {
                     new updateTwitterStatus().execute(status);

        Log.v("logged", "in");

    }

}

/**
 * Function to login twitter
 * */
class loginToTwitter extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(sharetw.this);
        pDialog.setMessage("Login to twitter...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Places JSON
     * */
    protected String doInBackground(String... args) {

        if (!isTwitterLoggedInAlready()) {
            Log.v("login method","df");
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
            twitter4j.conf.Configuration configuration = builder.build();

            TwitterFactory factory = new TwitterFactory(configuration);
            twitter = factory.getInstance();

            try {

                requestToken = twitter
                        .getOAuthRequestToken(TWITTER_CALLBACK_URL);


            } catch (TwitterException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog and show
     * the data in UI Always use runOnUiThread(new Runnable()) to update UI
     * from background thread, otherwise you will get error
     * **/
    protected void onPostExecute(String file_url) {

        pDialog.dismiss();
        Intent i2 = new Intent(Intent.ACTION_VIEW,
                Uri.parse(requestToken.getAuthenticationURL()));

        i2.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        i2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        i2.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        startActivity(i2);
        i2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);



    }
}

/**
 * Function to update status
 * */
class updateTwitterStatus extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(sharetw.this);
        pDialog.setMessage("Updating to twitter...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Places JSON
     * */
    protected String doInBackground(String... args) {
        Log.d("Tweet Text", "> " + args[0]);
        String status = args[0];


        try {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

            // Access Token
            String access_token = mSharedPreferences.getString(
                    PREF_KEY_OAUTH_TOKEN, "");
            // Access Token Secret
            String access_token_secret = mSharedPreferences.getString(
                    PREF_KEY_OAUTH_SECRET, "");

            AccessToken accessToken = new AccessToken(access_token,
                    access_token_secret);
            Twitter twitter = new TwitterFactory(builder.build())
                    .getInstance(accessToken);

            // Update status

            twitter4j.Status response = twitter.updateStatus(status);

            Log.d("Status", "> " + response.getText());
        } catch (TwitterException e) {
            // Error in updating status
            Log.d("Twitter Update Error", e.getMessage());
        }
        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog and show
     * the data in UI Always use runOnUiThread(new Runnable()) to update UI
     * from background thread, otherwise you will get error
     * **/
    protected void onPostExecute(String file_url) {

        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),
                        "Status tweeted successfully", Toast.LENGTH_SHORT)
                        .show();
                // Clearing EditText field
                twtreview.setText("");
            }
        });
    }
}

/**
 * Function to logout from twitter It will just clear the application shared
 * preferences
 * */
public void logoutFromTwitter() {
    AlertDialog.Builder alert = new AlertDialog.Builder(sharetw.this);
    alert.setTitle("Are u sure want to logout?");
    alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            Editor e = mSharedPreferences.edit();
            e.remove(PREF_KEY_OAUTH_TOKEN);
            e.remove(PREF_KEY_OAUTH_SECRET);
            e.remove(PREF_KEY_TWITTER_LOGIN);
            e.remove(TWITTER_CALLBACK_URL);
            e.remove(TWITTER_CONSUMER_SECRET);
            e.remove(URL_TWITTER_AUTH);
            e.remove(URL_TWITTER_OAUTH_VERIFIER);
            e.remove(username);
            e.remove(TWITTER_CONSUMER_KEY);
            e.remove(URL_TWITTER_OAUTH_TOKEN);
            e.clear();
            e.commit();
            layoutnotconect.setVisibility(View.VISIBLE);
            layoutconect.setVisibility(View.INVISIBLE);
            twtconect.setText("");
            twtconect.setVisibility(View.GONE);
            btnLoginTwitter.setVisibility(View.VISIBLE);
        }
    });

}

/**
 * Check user already logged in your application using twitter Login flag is
 * fetched from Shared Preferences
 * */
private boolean isTwitterLoggedInAlready() {
    // return twitter login status from Shared Preferences
    return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}






}


}
4

1 に答える 1

0

この投稿Android Twitter Connectivityを読んだ後、アプリケーションに twitter を統合するために socialauth-android SDK を統合しました。

私も同じ問題に直面していました。この SDK で、タスクを非同期に処理するのに役立つ例をいくつか見つけました。

于 2013-06-23T07:59:19.623 に答える