不幸的是,appname已停止

时间:2013-12-16 17:07:17

标签: java android eclipse twitter

我正在使用Android Twitter客户端,当代码在我的Android设备中执行时,它显示“不幸的是,appname已停止工作”。先前它有一个不同的logcat但它已经解决了。现在,当我编译它时,它有另一个错误导致应用程序停止。

这是logcat:

12-17 02:05:14.045: E/AndroidRuntime(24423): FATAL EXCEPTION: AsyncTask #1
12-17 02:05:14.045: E/AndroidRuntime(24423): java.lang.RuntimeException: An error occured while executing doInBackground()
12-17 02:05:14.045: E/AndroidRuntime(24423):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.lang.Thread.run(Thread.java:856)
12-17 02:05:14.045: E/AndroidRuntime(24423): Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at com.example.androidtwitterclient.MainActivity$DownloadTwitterTask.getResponseBody(MainActivity.java:120)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at com.example.androidtwitterclient.MainActivity$DownloadTwitterTask.getTwitterStream(MainActivity.java:165)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at com.example.androidtwitterclient.MainActivity$DownloadTwitterTask.doInBackground(MainActivity.java:67)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at com.example.androidtwitterclient.MainActivity$DownloadTwitterTask.doInBackground(MainActivity.java:1)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-17 02:05:14.045: E/AndroidRuntime(24423):    ... 5 more
12-17 02:05:14.045: E/AndroidRuntime(24423): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at libcore.io.Posix.getaddrinfo(Native Method)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
12-17 02:05:14.045: E/AndroidRuntime(24423):    at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
12-17 02:05:14.045: E/AndroidRuntime(24423):    ... 20 more
12-17 02:05:14.045: E/AndroidRuntime(24423): Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
12-17 02:05:14.045: E/AndroidRuntime(24423):    ... 23 more

这是我的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidtwitterclient"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        >
        <activity
            android:name="com.example.androidtwitterclient.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是我的mainactivity.xml文件:

package com.example.androidtwitterclient;

import android.app.ListActivity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.widget.ArrayAdapter;
import com.google.gson.Gson;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;

import java.io.*;
import java.net.URLEncoder;

/**
 * Demonstrates how to use a twitter application keys to access a user's timeline
 */
public class MainActivity extends ListActivity {

    private ListActivity activity;
    final static String ScreenName = "elvirachrisanty";
    final static String LOG_TAG = "rnc";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = this;

        downloadTweets();
    }

    // download twitter timeline after first checking to see if there is a network connection
    public void downloadTweets() {
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadTwitterTask().execute(ScreenName);
        } else {
            Log.v(LOG_TAG, "No network connection available.");
        }
    }

    // Uses an AsyncTask to download a Twitter user's timeline
    private class DownloadTwitterTask extends AsyncTask<String, Void, String> {
        final static String CONSUMER_KEY = "WWAtGnhZ11uSCPLjmN9Fw";
        final static String CONSUMER_SECRET = "ZnorUE440cG7vhEp25NS977fahiUFK1inqxnbDyedd0";
        final static String TwitterTokenURL = "https://api.twitter.com/oauth2/token";
        final static String TwitterStreamURL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=";

        @Override
        protected String doInBackground(String... screenNames) {
            String result = null;

            if (screenNames.length > 0) {
                result = getTwitterStream(screenNames[0]);
            }
            return result;
        }

        // onPostExecute convert the JSON results into a Twitter object (which is an Array list of tweets
        @Override
        protected void onPostExecute(String result) {
            Twitter twits = jsonToTwitter(result);

            // lets write the results to the console as well
            for (Tweet tweet : twits) {
                Log.i(LOG_TAG, tweet.getText());
            }

            // send the tweets to the adapter for rendering
            ArrayAdapter<Tweet> adapter = new ArrayAdapter<Tweet>(activity, android.R.layout.simple_list_item_1, twits);
            setListAdapter(adapter);
        }

        // converts a string of JSON data into a Twitter object
        private Twitter jsonToTwitter(String result) {
            Twitter twits = null;
            if (result != null && result.length() > 0) {
                try {
                    Gson gson = new Gson();
                    twits = gson.fromJson(result, Twitter.class);
                } catch (IllegalStateException ex) {
                    // just eat the exception
                }
            }
            return twits;
        }

        // convert a JSON authentication object into an Authenticated object
        private Authenticated jsonToAuthenticated(String rawAuthorization) {
            Authenticated auth = null;
            if (rawAuthorization != null && rawAuthorization.length() > 0) {
                try {
                    Gson gson = new Gson();
                    auth = gson.fromJson(rawAuthorization, Authenticated.class);
                } catch (IllegalStateException ex) {
                    // just eat the exception
                }
            }
            return auth;
        }

        private String getResponseBody(HttpRequestBase request) {
            StringBuilder sb = new StringBuilder();
            try {

                DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams());
                HttpResponse response = httpClient.execute(request);
                int statusCode = response.getStatusLine().getStatusCode();
                String reason = response.getStatusLine().getReasonPhrase();

                if (statusCode == 200) {

                    HttpEntity entity = response.getEntity();
                    InputStream inputStream = entity.getContent();

                    BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                    String line = null;
                    while ((line = bReader.readLine()) != null) {
                        sb.append(line);
                    }
                } else {
                    sb.append(reason);
                }
            } catch (UnsupportedEncodingException ex) {
            } catch (ClientProtocolException ex1) {
            } catch (IOException ex2) {
            }
            return sb.toString();
        }

        private String getTwitterStream(String screenName) {
            String results = null;

            // Step 1: Encode consumer key and secret
            try {
                // URL encode the consumer key and secret
                String urlApiKey = URLEncoder.encode(CONSUMER_KEY, "UTF-8");
                String urlApiSecret = URLEncoder.encode(CONSUMER_SECRET, "UTF-8");

                // Concatenate the encoded consumer key, a colon character, and the
                // encoded consumer secret
                String combined = urlApiKey + ":" + urlApiSecret;

                // Base64 encode the string
                String base64Encoded = Base64.encodeToString(combined.getBytes(), Base64.NO_WRAP);

                // Step 2: Obtain a bearer token
                HttpPost httpPost = new HttpPost(TwitterTokenURL);
                httpPost.setHeader("Authorization", "Basic " + base64Encoded);
                httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                httpPost.setEntity(new StringEntity("grant_type=client_credentials"));
                String rawAuthorization = getResponseBody(httpPost);
                Authenticated auth = jsonToAuthenticated(rawAuthorization);

                // Applications should verify that the value associated with the
                // token_type key of the returned object is bearer
                if (auth != null && auth.token_type.equals("bearer")) {

                    // Step 3: Authenticate API requests with bearer token
                    HttpGet httpGet = new HttpGet(TwitterStreamURL + screenName);

                    // construct a normal HTTPS request and include an Authorization
                    // header with the value of Bearer <>
                    httpGet.setHeader("Authorization", "Bearer " + auth.access_token);
                    httpGet.setHeader("Content-Type", "application/json");
                    // update the results with the body of the response
                    results = getResponseBody(httpGet);
                }
            } catch (UnsupportedEncodingException ex) {
            } catch (IllegalStateException ex1) {
            }
            return results;
        }
    }
}

真的很感激任何帮助

2 个答案:

答案 0 :(得分:1)

引起:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)

您必须在Manifest中添加此权限。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

答案 1 :(得分:1)

您需要申报互联网权限。只需添加

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

这些行到您的AndroidManifest.xml文件