2013-12-16 97 views
-2

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

这里是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; 
     } 
    } 
} 

任何帮助将真正不胜感激

+1

'造成的:java.lang.SecurityException异常:权限被拒绝(?缺少INTERNET权限)'你这个权限添加到您的清单?我不认为。 –

回答

1

您需要声明Internet权限。只需添加

<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文件

1

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

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

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