使用twitter API读取我的Android应用推文 - 强制关闭

时间:2014-07-15 17:22:54

标签: android android-activity twitter

我是Android App Development的初学者。我正在尝试阅读我的Android应用程序的推文。使用TwitterAsyncTask(从书中学习所有这些)。但是在我启动它之后app力就会关闭。我做错了什么?我怎么知道导致力量的错误呢?

package com.balani.fetchtweets;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ListActivity {
private TwitterAsyncTask twitterFetcher;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListAdapter adapter = new TwitterJSONAdapter();
setListAdapter(adapter);
twitterFetcher = new TwitterAsyncTask();
twitterFetcher.execute("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=abhibalani&count=20");
}

private class TwitterAsyncTask extends AsyncTask<String, Integer, JSONArray>{
private final URI URL = null;

@Override
   protected JSONArray doInBackground(String... params) {
   String response = getURLContents(params[0]);
        try {
            return new JSONArray(response);
        } catch (JSONException ex) { return null; }
    }


private String getURLContents(String string) {
    // TODO Auto-generated method stub

        String xml = null;
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(string);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return xml;

}

@Override
protected void onPostExecute(JSONArray response){
if(response == null)
return;
try{
((TwitterJSONAdapter)getListAdapter())
.setData(response);
getListView().setVisibility(View.VISIBLE);
View loading = findViewById(R.id.loading_text);
if(loading!=null)
loading.setVisibility(View.GONE);
}catch(Exception e){
Log.e("TwitterFeed","Failed to set Adapter");
}
}
}





private class TwitterJSONAdapter extends BaseAdapter {
    JSONArray data;
    //Must be called on the main thread
    private void setData(JSONArray data){
    this.data = data;
    this.notifyDataSetChanged();
    }
    @Override
    public int getCount() {
    if(data==null)
    return 0;
    else
    return data.length();
    }
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub

        if(data==null)
            return null;
            try{
            JSONObject element = (JSONObject)data.get(position);
            return element;
            }catch(Exception e){
            return null;
            }
    }
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        JSONObject node = (JSONObject)getItem(position);
        ViewGroup listView = null;
        //Reduce, Reuse, Recycle!
        if(convertView == null)
        listView =
        (ViewGroup)getLayoutInflater().inflate
        (R.layout.twitter_list_item, null);
        else
        listView = (ViewGroup)convertView;
        try{
        boolean retweeted = node.getInt("retweet_count") > 0;
        TextView tv =(TextView)listView.findViewById(R.id.text_one);
        tv.setText(node.getString("text"));
        if(retweeted)
        tv.setTextColor(0xFFFF0000);
        else
        tv.setTextColor(0xFFFFFFFF);
        tv = (TextView)listView.findViewById(R.id.text_two);
        tv.setText(node.getString("created_at"));

        if(retweeted)
            tv.setTextColor(0xFFFF0000);
            else
            tv.setTextColor(0xFFFFFFFF);
            }catch(JSONException e){
                Log.e("TwitterView","Failed to set list item",e);
                }
                return listView;
        }

    }
}
  

07-15 23:24:22.708:I / dalvikvm(30861):DexOpt:非法方法访问(调用Landroid / content / res / TypedArray ;.(Landroid / content / res / Resources; [I [II] V来自Landroid / content / res / XResources $ XTypedArray;)   07-15 23:24:22.708:I / dalvikvm(30861):找不到方法android.content.res.TypedArray。,从方法android.content.res.XResources $ XTypedArray中引用。   07-15 23:24:22.708:W / dalvikvm(30861):VFY:无法解析直接方法82:Landroid / content / res / TypedArray;。 (Landroid /内容/ RES /资源; [I [II)V   07-15 23:24:22.708:D / dalvikvm(30861):VFY:在0x0002处替换操作码0x70   07-15 23:24:22.978:I / Adreno-EGL(30861):: EGL 1.4 QUALCOMM Build:I0404c4692afb8623f95c43aeb6d5e13ed4b30ddb日期:11/06/13   07-15 23:24:23:008:D / OpenGLRenderer(30861):启用调试模式0   07-15 23:24:23.008:W / dalvikvm(30861):threadid = 11:线程退出时未捕获异常(group = 0x415dfc68)   07-15 23:24:23.018:E / AndroidRuntime(30861):致命异常:AsyncTask#1   07-15 23:24:23.018:E / AndroidRuntime(30861):进程:com.balani.fetchtweets,PID:30861   07-15 23:24:23.018:E / AndroidRuntime(30861):java.lang.RuntimeException:执行doInBackground()时发生错误   07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ 3.done(AsyncTask.java:300)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.setException(FutureTask.java:222)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.run(FutureTask.java:242)   07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.lang.Thread.run(Thread.java:841)   07-15 23:24:23.018:E / AndroidRuntime(30861):引起:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.lookupHostByName(InetAddress.java:418)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.getAllByName(InetAddress.java:214)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)   07-15 23:24:23.018:E / AndroidRuntime(30861):at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)   07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.getURLContents(MainActivity.java:71)   07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.doInBackground(MainActivity.java:57)   07-15 23:24:23.018:E / AndroidRuntime(30861):at com.balani.fetchtweets.MainActivity $ TwitterAsyncTask.doInBackground(MainActivity.java:1)   07-15 23:24:23.018:E / AndroidRuntime(30861):在android.os.AsyncTask $ 2.call(AsyncTask.java:288)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.util.concurrent.FutureTask.run(FutureTask.java:237)   07-15 23:24:23.018:E / AndroidRuntime(30861):......还有4个   07-15 23:24:23.018:E / AndroidRuntime(30861):引起:libcore.io.GaiException:getaddrinfo失败:EAI_NODATA(没有与主机名关联的地址)   07-15 23:24:23.018:E / AndroidRuntime(30861):at libcore.io.Posix.getaddrinfo(Native Method)   07-15 23:24:23.018:E / AndroidRuntime(30861):at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)   07-15 23:24:23.018:E / AndroidRuntime(30861):at java.net.InetAddress.lookupHostByName(InetAddress.java:405)   07-15 23:24:23.018:E / AndroidRuntime(30861):... 18更多   07-15 23:24:23.018:E / AndroidRuntime(30861):引起:libcore.io.ErrnoException:getaddrinfo失败:EACCES(权限被拒绝)   07-15 23:24:23.018:E / AndroidRuntime(30861):... 21更多   07-15 23:24:25.128:I / Process(30861):发送信号。 PID:30861 SIG:9

1 个答案:

答案 0 :(得分:1)

Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)

INTERNET权限添加到清单文件中。

你必须添加这一行:

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

AndroidManifest.xml

应用程序代码之外的