2013-12-21 40 views
0

我想製作一個twitter客戶端,用戶可以在那裏使用自己的API密鑰,但應用程序崩潰。我如何允許用戶設置密鑰,以下是我所嘗試的。Android的twitter4j自定義API密鑰

如何在用戶未設置密鑰時捕獲異常?

package com.kerseykyle.customtweet; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.graphics.Color; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import twitter4j.*; 
import twitter4j.auth.AccessToken; 

public class MainActivity extends Activity { 
    Context mContext; 
    Twitter mTwitter; 
    static int MAX_COUNT = 140; 
    Button btnTweet; 
    SharedPreferences prefs; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mContext = getApplicationContext(); 
     mTwitter = new TwitterFactory().getInstance(); 

     EditText txtStatus = (EditText) findViewById(R.id.TweetData); 
     final TextView lblCount = (TextView) findViewById(R.id.count); 

     txtStatus.addTextChangedListener(new TextWatcher() { 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       // TODO Auto-generated method stub 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      public void afterTextChanged(Editable s) { 

       // Display Remaining Character with respective color 
       int count = MAX_COUNT - s.length(); 
       lblCount.setText(Integer.toString(count)); 
       lblCount.setTextColor(Color.GREEN); 
       if (count < 10) { 
        lblCount.setTextColor(Color.YELLOW); 
       } 
       if (count < 0) { 
        lblCount.setTextColor(Color.RED); 
       } 
       if (count > 0) { 
        Button mSend = (Button) findViewById(R.id.postTweet); 
        mSend.setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 
          EditText info = (EditText) findViewById(R.id.TweetData); 
          String mUpdateStatus = info.getText().toString(); 
          try { 
           Status status = mTwitter 
             .updateStatus(mUpdateStatus); 
           Toast.makeText(getApplicationContext(), 
             "Updating status", Toast.LENGTH_LONG) 
             .show(); 
          } catch (TwitterException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         } 
        }); 
       } 

      } 

     }); 

    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu){ 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return true; 
    } 

    //called when an option is clicked 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item){ 
     switch(item.getItemId()){ 
     case R.id.item_prefs: 
      startActivity(new Intent(this, PrefsActivity.class)); 
      break; 
     } 
     return true; 
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { 
     mTwitter.setOAuthConsumer(prefs.getString("consumer_key", ""), prefs.getString("consumer_secret", "")); 
     String token = prefs.getString("access_token", ""); 
     String secret = prefs.getString("secret_access_token", ""); 
     AccessToken at = new AccessToken(token, secret); 
     mTwitter.setOAuthAccessToken(at); 
    } 

} 

這裏是logcat的:

E/AndroidRuntime(14095): FATAL EXCEPTION: main 
E/AndroidRuntime(14095): java.lang.NoClassDefFoundError: twitter4j.TwitterFactory 
E/AndroidRuntime(14095): at com.kerseykyle.customtweet.MainActivity.onCreate(MainActivity.java:36) 
E/AndroidRuntime(14095): at android.app.Activity.performCreate(Activity.java:4465) 
E/AndroidRuntime(14095): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
E/AndroidRuntime(14095): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
E/AndroidRuntime(14095): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
E/AndroidRuntime(14095): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
E/AndroidRuntime(14095): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
E/AndroidRuntime(14095): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(14095): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(14095): at android.app.ActivityThread.main(ActivityThread.java:4424) 
E/AndroidRuntime(14095): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(14095): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(14095): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
E/AndroidRuntime(14095): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
E/AndroidRuntime(14095): at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 145): Force finishing activity com.kerseykyle.customtweet/.MainActivity 

回答

0

難道是因爲你的庫文件夾的名稱一樣簡單。確保它被命名爲「libs」。然後把twitter4j jar放到那裏。

+0

我將twitter4j jar添加到了我的項目中。 –

1

java.lang.NoClassDefFoundError:twitter4j.TwitterFactory

這個錯誤可能發生,因爲twitter4j-core.jar添加或twitter4j-stream.jar不適到你的項目構建路徑。嘗試檢查它。

相關問題