2012-07-26 27 views
1

我在整合我的Android應用嘰嘰喳喳,有開放空空的應用程序堆棧跟蹤前一個異常occure是: -爲什麼TwitterApp會給VerifyError?

07-26 16:01:34.004: E/AndroidRuntime(1043): FATAL EXCEPTION: main 
    07-26 16:01:34.004: E/AndroidRuntime(1043): java.lang.VerifyError: com.appstudioz.twitter.TwitterApp 
    07-26 16:01:34.004: E/AndroidRuntime(1043):  at com.appstudioz.bidnear.NewsFeed.onCreate(NewsFeed.java:44) 
    07-26 16:01:34.004: E/AndroidRuntime(1043): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    07-26 16:01:34.004: E/AndroidRuntime(1043): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
    07-26 16:01:34.004: E/AndroidRuntime(1043): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
    07-26 16:01:34.004: E/AndroidRuntime(1043): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at android.os.Looper.loop(Looper.java:132) 
07-26 16:01:34.004: E/AndroidRuntime(1043):  at android.app.ActivityThread.main(ActivityThread.java:4025) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at java.lang.reflect.Method.invokeNative(Native Method) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at java.lang.reflect.Method.invoke(Method.java:491) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-26 16:01:34.004: E/AndroidRuntime(1043): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    07-26 16:01:34.004: E/AndroidRuntime(1043): at dalvik.system.NativeStart.main(Native Method) 

,我使用這個代碼: -

按鈕mbutton;

private TwitterApp mTwitter; 
ProgressDialog mProgressDialog = null; 
private String url; 

/** Called when the activity is first created. */ 
public static final String CONSUMER_KEY = "mdgzcl73NRkKaRzqVutQpA"; 
public static final String CONSUMER_SECRET="FVZwc6m4FZ5TbAU2uAfWhbxUMMcZ835Hp3VWBEF10"; 

private enum FROM { 
    TWITTER_POST, TWITTER_LOGIN 
}; 

private enum MESSAGE { 
    SUCCESS, DUPLICATE, FAILED, CANCELLED 
}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.demo);//newsfeed); 
    mbutton = (Button)findViewById(R.id.demo); 
    mbutton.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
     calltwitter();   
     } 
    }); 
    mTwitter = new TwitterApp(NewsFeed.this, CONSUMER_KEY, CONSUMER_SECRET); 
    mTwitter.setListener(mTwLoginDialogListener); 
    //setTabs(); 
} 

private void calltwitter() 
{ 


    if (mTwitter.hasAccessToken()) 
    { 
     try 
     { 
      String comment = "I found this App Send SuccessFully..?"; 
      String demo = "Hi ! Share Have been done ..."; 
      try { 
       mTwitter.updateStatus(demo); 
       //mTwitter.updateStatus("rentfaster: "+demo+"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }catch(Exception e) 
     { 

     } 
    } 
    else 
    { 
     mTwitter.authorize(); 
    } 


} 


/** 
* Twitter Dialog Listner. 
*/ 
//private TwDialogListener mTwLoginDialogListener = new TwDialogListener() 

private TwDialogListener mTwLoginDialogListener = new TwDialogListener() { 

    public void onError(String value) { 
     mTwitter.resetAccessToken(); 
    } 

    public void onComplete(String value) { 

     String comment = "I found working fine"; 
     try 
     { 
      String demo = "Hi ! Share Have been done ..."; 
      try { 
       mTwitter.updateStatus(demo); 
       //mTwitter.updateStatus("rentfaster: "+demo+"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }catch(Exception e) 
     { 

     } 
     mTwitter.resetAccessToken(); 
    } 
}; 

private void setTabs() 
{ 


} 

空空例外上面的應用程序之前occure。我的一些需求量的數據分享到Twitter,但在第一個步驟我面對這個問題,請有人建議我!

回答

2

爲此使用Twitter4j庫,並使用以下代碼將twitter集成到您的應用程序中。

MainActivity.java

private TwitterApp mTwitter; 
    private static final String CONSUMER_KEY = "your consumer key"; 
    private static final String CONSUMER_SECRET = "your consumer secret key"; 

    private enum FROM { 
     TWITTER_POST, TWITTER_LOGIN 
    }; 

    private enum MESSAGE { 
     SUCCESS, DUPLICATE, FAILED, CANCELLED 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mTwitter = new TwitterApp(this, CONSUMER_KEY, CONSUMER_SECRET); 
    } 

    public void onClick(View v) { 
     mTwitter.setListener(mTwLoginDialogListener); 
     mTwitter.resetAccessToken(); 
     if (mTwitter.hasAccessToken() == true) { 
      try { 
       mTwitter.updateStatus(TwitterApp.MESSAGE); 
       postAsToast(FROM.TWITTER_POST, MESSAGE.SUCCESS); 
      } catch (Exception e) { 
       if (e.getMessage().toString().contains("duplicate")) { 
        postAsToast(FROM.TWITTER_POST, MESSAGE.DUPLICATE); 
       } 
       e.printStackTrace(); 
      } 
      mTwitter.resetAccessToken(); 
     } else { 
      mTwitter.authorize(); 
     } 
    } 

    private void postAsToast(FROM twitterPost, MESSAGE success) { 
     switch (twitterPost) { 
     case TWITTER_LOGIN: 
      switch (success) { 
      case SUCCESS: 
       Toast.makeText(this, "Login Successful", Toast.LENGTH_LONG) 
         .show(); 
       break; 
      case FAILED: 
       Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show(); 
      default: 
       break; 
      } 
      break; 
     case TWITTER_POST: 
      switch (success) { 
      case SUCCESS: 
       Toast.makeText(this, "Posted Successfully", Toast.LENGTH_LONG) 
         .show(); 
       break; 
      case FAILED: 
       Toast.makeText(this, "Posting Failed", Toast.LENGTH_LONG) 
         .show(); 
       break; 
      case DUPLICATE: 
       Toast.makeText(this, 
         "Posting Failed because of duplicate message...", 
         Toast.LENGTH_LONG).show(); 
      default: 
       break; 
      } 
      break; 
     } 
    } 

    private TwDialogListener mTwLoginDialogListener = new TwDialogListener() { 

     @Override 
     public void onError(String value) { 
      postAsToast(FROM.TWITTER_LOGIN, MESSAGE.FAILED); 
      Log.e("TWITTER", value); 
      mTwitter.resetAccessToken(); 
     } 

     @Override 
     public void onComplete(String value) { 
      try { 
       mTwitter.updateStatus(TwitterApp.MESSAGE); 
       postAsToast(FROM.TWITTER_POST, MESSAGE.SUCCESS); 
      } catch (Exception e) { 
       if (e.getMessage().toString().contains("duplicate")) { 
        postAsToast(FROM.TWITTER_POST, MESSAGE.DUPLICATE); 
       } 
       e.printStackTrace(); 
      } 
      mTwitter.resetAccessToken(); 
     } 
    }; 

添加以下3類爲新建包 「com.twitter.android」

1級:-(TwitterApp.java)

package com.twitter.android; 

import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLDecoder; 
import oauth.signpost.OAuthProvider; 
import oauth.signpost.basic.DefaultOAuthProvider; 
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.TwitterFactory; 
import twitter4j.User; 
import twitter4j.http.AccessToken; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Handler; 
import android.os.Message; 
import android.view.Window; 


public class TwitterApp { 
    private Twitter mTwitter; 
    private TwitterSession mSession; 
    private AccessToken mAccessToken; 
    private CommonsHttpOAuthConsumer mHttpOauthConsumer; 
    private OAuthProvider mHttpOauthprovider; 
    private String mConsumerKey; 
    private String mSecretKey; 
    private ProgressDialog mProgressDlg; 
    private TwDialogListener mListener; 
    private Activity context; 


    public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
    public static final String OAUTH_CALLBACK_HOST  = "callback"; 
    public static final String CALLBACK_URL  = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 
    private static final String TWITTER_ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token"; 
    private static final String TWITTER_AUTHORZE_URL = "https://api.twitter.com/oauth/authorize"; 
    private static final String TWITTER_REQUEST_URL = "https://api.twitter.com/oauth/request_token"; 
    public static final String MESSAGE = "Hello Everyone...."; 

    public TwitterApp(Activity context, String consumerKey, String secretKey) { 
     this.context = context; 

     mTwitter = new TwitterFactory().getInstance(); 
     mSession = new TwitterSession(context); 
     mProgressDlg = new ProgressDialog(context); 

     mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     mConsumerKey = consumerKey; 
     mSecretKey = secretKey; 

     mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, 
       mSecretKey); 

     String request_url=TWITTER_REQUEST_URL; 
     String access_token_url=TWITTER_ACCESS_TOKEN_URL; 
     String authorize_url=TWITTER_AUTHORZE_URL; 

     mHttpOauthprovider = new DefaultOAuthProvider(
       request_url, 
       access_token_url, 
       authorize_url); 
     mAccessToken = mSession.getAccessToken(); 

     configureToken(); 
    } 

    public void setListener(TwDialogListener listener) { 
     mListener = listener; 
    } 

    @SuppressWarnings("deprecation") 
    private void configureToken() { 
     if (mAccessToken != null) { 
      mTwitter.setOAuthConsumer(mConsumerKey, mSecretKey); 
      mTwitter.setOAuthAccessToken(mAccessToken); 
     } 
    } 

    public boolean hasAccessToken() { 
     return (mAccessToken == null) ? false : true; 
    } 

    public void resetAccessToken() { 
     if (mAccessToken != null) { 
      mSession.resetAccessToken(); 

      mAccessToken = null; 
     } 
    } 

    public String getUsername() { 
     return mSession.getUsername(); 
    } 

    public void updateStatus(String status) throws Exception { 
     try { 
      mTwitter.updateStatus(status); 
     } catch (TwitterException e) { 
      throw e; 
     } 
    } 

    public void authorize() { 
     mProgressDlg.setMessage("Initializing ..."); 
     mProgressDlg.show(); 

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

       try { 
        authUrl = mHttpOauthprovider.retrieveRequestToken(
          mHttpOauthConsumer, CALLBACK_URL); 
        what = 0; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       mHandler.sendMessage(mHandler 
         .obtainMessage(what, 1, 0, authUrl)); 
      } 
     }.start(); 
    } 

    public void processToken(String callbackUrl) { 
     mProgressDlg.setMessage("Finalizing ..."); 
     mProgressDlg.show(); 

     final String verifier = getVerifier(callbackUrl); 

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

       try { 
        mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer, 
          verifier); 

        mAccessToken = new AccessToken(
          mHttpOauthConsumer.getToken(), 
          mHttpOauthConsumer.getTokenSecret()); 

        configureToken(); 

        User user = mTwitter.verifyCredentials(); 

        mSession.storeAccessToken(mAccessToken, user.getName()); 

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

       mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0)); 
      } 
     }.start(); 
    } 

    private String getVerifier(String callbackUrl) { 
     String verifier = ""; 

     try { 
      callbackUrl = callbackUrl.replace("twitterapp", "http"); 

      URL url = new URL(callbackUrl); 
      String query = url.getQuery(); 

      String array[] = query.split("&"); 

      for (String parameter : array) { 
       String v[] = parameter.split("="); 

       if (URLDecoder.decode(v[0]).equals(
         oauth.signpost.OAuth.OAUTH_VERIFIER)) { 
        verifier = URLDecoder.decode(v[1]); 
        break; 
       } 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 

     return verifier; 
    } 

    private void showLoginDialog(String url) { 
     final TwDialogListener listener = new TwDialogListener() { 

      public void onComplete(String value) { 
       processToken(value); 
      } 

      public void onError(String value) { 
       mListener.onError("Failed opening authorization page"); 
      } 
     }; 

     new TwitterDialog(context, url, listener).show(); 
    } 

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

      if (msg.what == 1) { 
       if (msg.arg1 == 1) 
        mListener.onError("Error getting request token"); 
       else 
        mListener.onError("Error getting access token"); 
      } else { 
       if (msg.arg1 == 1) 
        showLoginDialog((String) msg.obj); 
       else 
        mListener.onComplete(""); 
      } 
     } 
    }; 

    public interface TwDialogListener { 
     public void onComplete(String value); 

     public void onError(String value); 
    } 
} 

2級: - (TwitterDialog.java)

package com.twitter.android; 

import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Color; 
import android.graphics.Typeface; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.view.Display; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import com.twitter.android.TwitterApp.TwDialogListener; 

public class TwitterDialog extends Dialog { 

    static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 }; 
    static final float[] DIMENSIONS_PORTRAIT = { 280, 420 }; 
    static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, 
      ViewGroup.LayoutParams.FILL_PARENT); 
    static final int MARGIN = 4; 
    static final int PADDING = 2; 
    private String mUrl; 
    private TwDialogListener mListener; 
    private ProgressDialog mSpinner; 
    private WebView mWebView; 
    private LinearLayout mContent; 
    private TextView mTitle; 
    private boolean progressDialogRunning = false; 

    public TwitterDialog(Context context, String url, TwDialogListener listener) { 
     super(context); 

     mUrl = url; 
     mListener = listener; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mSpinner = new ProgressDialog(getContext()); 

     mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     mSpinner.setMessage("Loading..."); 

     mContent = new LinearLayout(getContext()); 

     mContent.setOrientation(LinearLayout.VERTICAL); 

     setUpTitle(); 
     setUpWebView(); 

     Display display = getWindow().getWindowManager().getDefaultDisplay(); 
     final float scale = getContext().getResources().getDisplayMetrics().density; 
     float[] dimensions = (display.getWidth() < display.getHeight()) ? DIMENSIONS_PORTRAIT 
       : DIMENSIONS_LANDSCAPE; 

     addContentView(mContent, new FrameLayout.LayoutParams(
       (int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1] 
         * scale + 0.5f))); 
    } 

    private void setUpTitle() { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     Drawable icon = getContext().getResources().getDrawable(
       R.drawable.twitter_icon); 

     mTitle = new TextView(getContext()); 

     mTitle.setText("Twitter"); 
     mTitle.setTextColor(Color.WHITE); 
     mTitle.setTypeface(Typeface.DEFAULT_BOLD); 
     mTitle.setBackgroundColor(0xFFbbd7e9); 
     mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN); 
     mTitle.setCompoundDrawablePadding(MARGIN + PADDING); 
     mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); 

     mContent.addView(mTitle); 
    } 

    private void setUpWebView() { 
     mWebView = new WebView(getContext()); 

     mWebView.setVerticalScrollBarEnabled(false); 
     mWebView.setHorizontalScrollBarEnabled(false); 
     mWebView.setWebViewClient(new TwitterWebViewClient()); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.loadUrl(mUrl); 
     mWebView.setLayoutParams(FILL); 

     mContent.addView(mWebView); 
    } 

    private class TwitterWebViewClient extends WebViewClient { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if (url.startsWith(TwitterApp.CALLBACK_URL)) { 
       mListener.onComplete(url); 

       TwitterDialog.this.dismiss(); 

       return true; 
      } else if (url.startsWith("authorize")) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, 
       String description, String failingUrl) { 
      super.onReceivedError(view, errorCode, description, failingUrl); 
      mListener.onError(description); 
      TwitterDialog.this.dismiss(); 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mSpinner.show(); 
      progressDialogRunning = true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      String title = mWebView.getTitle(); 
      if (title != null && title.length() > 0) { 
       mTitle.setText(title); 
      } 
      progressDialogRunning = false; 
      mSpinner.dismiss(); 
     } 

    } 

    @Override 
    protected void onStop() { 
     progressDialogRunning = false; 
     super.onStop(); 
    } 

    public void onBackPressed() { 
     if(!progressDialogRunning){ 
      TwitterDialog.this.dismiss(); 
     } 
    } 
} 

3類: - (TwitterSession.java)

package com.twitter.android; 

import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.content.Context; 
import twitter4j.http.AccessToken; 

public class TwitterSession { 
    private SharedPreferences sharedPref; 
    private Editor editor; 

    private static final String TWEET_AUTH_KEY = "auth_key"; 
    private static final String TWEET_AUTH_SECRET_KEY = "auth_secret_key"; 
    private static final String TWEET_USER_NAME = "user_name"; 
    private static final String SHARED = "Twitter_Preferences"; 

    public TwitterSession(Context context) { 
     sharedPref = context.getSharedPreferences(SHARED, Context.MODE_PRIVATE); 

     editor = sharedPref.edit(); 
    } 

    public void storeAccessToken(AccessToken accessToken, String username) { 
     editor.putString(TWEET_AUTH_KEY, accessToken.getToken()); 
     editor.putString(TWEET_AUTH_SECRET_KEY, accessToken.getTokenSecret()); 
     editor.putString(TWEET_USER_NAME, username); 

     editor.commit(); 
    } 

    public void resetAccessToken() { 
     editor.putString(TWEET_AUTH_KEY, null); 
     editor.putString(TWEET_AUTH_SECRET_KEY, null); 
     editor.putString(TWEET_USER_NAME, null); 

     editor.commit(); 
    } 

    public String getUsername() { 
     return sharedPref.getString(TWEET_USER_NAME, ""); 
    } 

    public AccessToken getAccessToken() { 
     String token = sharedPref.getString(TWEET_AUTH_KEY, null); 
     String tokenSecret = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null); 

     if (token != null && tokenSecret != null) 
      return new AccessToken(token, tokenSecret); 
     else 
      return null; 
    } 
} 

而作爲一個Refrence庫添加以下JAR文件到您的項目: -

1)路標-commonshttp4-1.2.1.1.jar

2)路標核-1.2.1.1.jar

3)路標-jetty6-1.2.1.1.jar

4)twitter4j核-2.1.6.jar

+0

感謝我想你的代碼... – skt 2012-07-26 10:32:26

+0

我的事情你的代碼和我的代碼是一樣的,也許問題並不在此代碼。 – skt 2012-07-26 10:39:00

+0

@skt ok檢查一下,如果你有任何疑問,請告訴我。 – 2012-07-26 10:42:00

2

只需將lib文件夾中的jar文件移動到libs即可。它爲我工作。

0

它的SDK的問題,我沒有更新我的sdk.It的做工精細