私はアンドロイド開発に不慣れです.....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);
}
}
}