2013-12-17 36 views
1

我正在按照教程創建一個Twitter客戶端以在Android中發佈推文。 不過,我得到了錯誤「生成不能被解析爲一個變量」,在下面一行:TargetAPI-生成無法解析爲變量

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 

這裏是完整MainActivity.java代碼:

package com.androidhive.twitterconnect; 

import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.TwitterFactory; 
import twitter4j.User; 
import twitter4j.auth.AccessToken; 
import twitter4j.auth.RequestToken; 
import twitter4j.conf.Configuration; 
import twitter4j.conf.ConfigurationBuilder; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.annotation.TargetApi; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.content.pm.ActivityInfo; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.StrictMode; 
import android.os.Bundle; 
import android.text.Html; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    // Constants 
    /** 
    * Register your here app https://dev.twitter.com/apps/new and get your 
    * consumer key and secret 
    * */ 
    static String TWITTER_CONSUMER_KEY = "CV78QI1eZAgGe9mMS7A"; // place your cosumer key here 
    static String TWITTER_CONSUMER_SECRET = "zCYkLsHlAVf7DoWJlDbfqeFsghXQCu2dUaFC2O94HQ"; // place your consumer secret here 

    // Preference Constants 
    static String PREFERENCE_NAME = "twitter_oauth"; 
    static final String PREF_KEY_OAUTH_TOKEN = "oauth_token"; 
    static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret"; 
    static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn"; 

    static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; 

    // Twitter oauth urls 
    static final String URL_TWITTER_AUTH = "auth_url"; 
    static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; 
    static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token"; 

    // Login button 
    Button btnLoginTwitter; 
    // Update status button 
    Button btnUpdateStatus; 
    // Logout button 
    Button btnLogoutTwitter; 
    // EditText for update 
    EditText txtUpdate; 
    // lbl update 
    TextView lblUpdate; 
    TextView lblUserName; 

    // Progress dialog 
    ProgressDialog pDialog; 

    // Twitter 
    private static Twitter twitter; 
    private static RequestToken requestToken; 

    // Shared Preferences 
    private static SharedPreferences mSharedPreferences; 

    // Internet Connection detector 
    private ConnectionDetector cd; 

    // Alert Dialog Manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(MainActivity.this, "Internet Connection Error", 
        "Please connect to working Internet connection", false); 
      // stop executing code by return 
      return; 
     } 

     // Check if twitter keys are set 
     if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){ 
      // Internet Connection is not present 
      alert.showAlertDialog(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); 
      // stop executing code by return 
      return; 
     } 

     // All UI elements 
     btnLoginTwitter = (Button) findViewById(R.id.btnLoginTwitter); 
     btnUpdateStatus = (Button) findViewById(R.id.btnUpdateStatus); 
     btnLogoutTwitter = (Button) findViewById(R.id.btnLogoutTwitter); 
     txtUpdate = (EditText) findViewById(R.id.txtUpdateStatus); 
     lblUpdate = (TextView) findViewById(R.id.lblUpdate); 
     lblUserName = (TextView) findViewById(R.id.lblUserName); 

     // Shared Preferences 
     mSharedPreferences = getApplicationContext().getSharedPreferences(
       "MyPref", 0); 

     /** 
     * Twitter login button click event will call loginToTwitter() function 
     * */ 
     btnLoginTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call login twitter function 
       loginToTwitter(); 
      } 
     }); 

     /** 
     * Button click event to Update Status, will call updateTwitterStatus() 
     * function 
     * */ 
     btnUpdateStatus.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Call update status function 
       // Get the status from EditText 
       String status = txtUpdate.getText().toString(); 

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

     /** 
     * Button click event for logout from twitter 
     * */ 
     btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Call logout twitter function 
       logoutFromTwitter(); 
      } 
     }); 

     /** 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 
        AccessToken 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()); 

        // Hide login button 
        btnLoginTwitter.setVisibility(View.GONE); 

        // Show Update Twitter 
        lblUpdate.setVisibility(View.VISIBLE); 
        txtUpdate.setVisibility(View.VISIBLE); 
        btnUpdateStatus.setVisibility(View.VISIBLE); 
        btnLogoutTwitter.setVisibility(View.VISIBLE); 

        // Getting user details from twitter 
        // For now i am getting his name only 
        long userID = accessToken.getUserId(); 
        User user = twitter.showUser(userID); 
        String username = user.getName(); 

        // Displaying in xml ui 
        lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); 
       } catch (Exception e) { 
        // Check log for login errors 
        Log.e("Twitter Login Error", "> " + e.getMessage()); 
       } 
      } 
     } 

    } 

    /** 
    * Function to login twitter 
    * */ 
    private void loginToTwitter() { 
     // Check if already logged in 
     if (!isTwitterLoggedInAlready()) { 
      ConfigurationBuilder builder = new ConfigurationBuilder(); 
      builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); 
      builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 
      Configuration configuration = builder.build(); 

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

      try { 
       requestToken = twitter 
         .getOAuthRequestToken(TWITTER_CALLBACK_URL); 
       this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
         .parse(requestToken.getAuthenticationURL()))); 
      } catch (TwitterException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      // user already logged into twitter 
      Toast.makeText(getApplicationContext(), 
        "Already Logged into twitter", Toast.LENGTH_LONG).show(); 
     } 
    } 

    /** 
    * 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(MainActivity.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) { 
      // dismiss the dialog after getting all products 
      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 
        txtUpdate.setText(""); 
       } 
      }); 
     } 

    } 

    /** 
    * Function to logout from twitter 
    * It will just clear the application shared preferences 
    * */ 
    private void logoutFromTwitter() { 
     // Clear the shared preferences 
     Editor e = mSharedPreferences.edit(); 
     e.remove(PREF_KEY_OAUTH_TOKEN); 
     e.remove(PREF_KEY_OAUTH_SECRET); 
     e.remove(PREF_KEY_TWITTER_LOGIN); 
     e.commit(); 

     // After this take the appropriate action 
     // I am showing the hiding/showing buttons again 
     // You might not needed this code 
     btnLogoutTwitter.setVisibility(View.GONE); 
     btnUpdateStatus.setVisibility(View.GONE); 
     txtUpdate.setVisibility(View.GONE); 
     lblUpdate.setVisibility(View.GONE); 
     lblUserName.setText(""); 
     lblUserName.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); 
    } 

    protected void onResume() { 
     super.onResume(); 
    } 

} 

我想知道如果我有定義一些東西或TargetAPI有問題? 任何幫助將是非常appreaciated

+0

我認爲你忘了導入'android.annotation.TargetApi;'。 – Fllo

+0

我已經導入它。 – elvirachrisanty

+0

的確,我沒有看到它。 – Fllo

回答

2

請Android版本設置你10或大於10,並刪除@TargetAPI線形態的OnCreate()

使用這段代碼,而不是用於Strictmode

if (android.os.Build.VERSION.SDK_INT > 9) 
     { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
      StrictMode.enableDefaults(); 
     }