0

Android用のtwitterクライアントをプログラムしようとしています(twitter4jを使用)。これまでのところ、アイデアはシンプルな GUI で、SD カードに OAuth トークンを含むファイルがない場合は、AsyncTask を使用して Twitter API に接続し、承認用の URL を取得して、既定のブラウザーを開きます。ただし、ブラウザは実行されません。これを修正しようとして行ったさまざまな変更に応じて、アクティビティは正常に起動しますが、ブラウザは起動しないか、アクティビティがクラッシュします。私は少しフラストレーションと混乱を感じるところまで来ました。誰かが私のコードの問題点を指摘できますか?

public class StatusActivity extends Activity {

private static final String TAG = "StatusActivity";
EditText editText;
Button updateButton;
File oauthfile = null;
public Context context = getApplicationContext();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_status);

    Log.d(TAG, "started");
    // Find views
    editText = (EditText) findViewById(R.id.editText); //
    updateButton = (Button) findViewById(R.id.buttonUpdate);

    oauthfile = new File("sdcard/auth_file.txt");

    //Check if the file with the keys exist
    if (oauthfile.exists()==false){
        Log.d(TAG, "file not created");
        Context context = getApplicationContext();
        Toast toast = Toast.makeText(context, "file not created.",    Toast.LENGTH_SHORT);
        toast.show();
        new Authorization(context).execute();

    }


}

public void openBrowser (View v){
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
    startActivity(browserIntent);
    Log.d(TAG, "onclick");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.status, menu);
    return true;
    }
}

class Authorization extends AsyncTask <String, Integer, String>{
String url = null;
private Context context;

 Authorization(Context context) {
        this.context = context.getApplicationContext();
    }



public void onPreExecute() {
       super.onPreExecute();
       Toast.makeText(context, "Invoke onPreExecute()", Toast.LENGTH_SHORT).show();         
      }


@Override
public String doInBackground(String... params) {
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.setDebugEnabled(true)
//I have eliminated the keys from the question :)
    .setOAuthConsumerKey("XXXXXXXXXXXXXX")
    .setOAuthConsumerSecret("XXXXXXXXXXXXXXX");
    Twitter OAuthTwitter = new TwitterFactory(configBuilder.build()).getInstance();
    RequestToken requestToken = null;
    AccessToken accessToken = null;     
    do{
        try {
            requestToken = OAuthTwitter.getOAuthRequestToken();
            url = requestToken.getAuthorizationURL();
        } 
        catch (TwitterException ex) {
            ex.printStackTrace();
        }       
    }
    while (accessToken==null);
    return url;
}

protected void onPostExecute(String result) {
    super.onPostExecute(result);

    Toast.makeText(context, "Opening browser.", Toast.LENGTH_SHORT).show();

    Intent browserIntent = new Intent(Intent.ACTION_ALL_APPS, Uri.parse(url));
    context.startActivity(browserIntent);
}
}

トースト「ファイルが作成されていません」が表示されるため、少なくともトークンのファイルが存在するかどうかを確認し、ボタンを押すとアクティビティがブラウザーを実行できることを知っています。アプリには、SD カードへの書き込みとインターネットの使用権限があります。前もって感謝します。

Logcat トレース:

03-28 19:02:32.816: E/AndroidRuntime(278): FATAL EXCEPTION: main
03-28 19:02:32.816: E/AndroidRuntime(278): java.lang.RuntimeException: Unable to     instantiate activity     ComponentInfo{com.versec.pardinus/com.versec.pardinus.StatusActivity}: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Looper.loop(Looper.java:123)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invokeNative(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invoke(Method.java:521)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 19:02:32.816: E/AndroidRuntime(278):  at dalvik.system.NativeStart.main(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278): Caused by: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.versec.pardinus.StatusActivity.<init>(StatusActivity.java:30)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstanceImpl(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstance(Class.java:1429)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
03-28 19:02:32.816: E/AndroidRuntime(278):  ... 11 more
4

1 に答える 1

1

これがクラッシュの原因です。

public Context context = getApplicationContext();

必要なときにも使用していないので、この行を取り除くことができます.

ところで、あなたのコードを見ているときに気づいた他のことは次のとおりです。

oauthfile = new File("sdcard/auth_file.txt");

「sdcard/」パスを当然のことと考えないでください。代わりにこれを使用してください:

    File dir = Environment.getExternalStorageDirectory();
    File oauthfile = new File(dir, "auth_file.txt");
于 2013-03-28T19:13:12.110 に答える