2010-07-02 4 views
0

Commencé à coder une application Android simple. Une partie de l'application tire les utilisateurs 20 derniers tweets et les enregistre dans une base de données.Si je l'exécute, statuses = twitter.getUserTimeline(), lève une exception son manipulé et imprime: a échoué pour obtenir l'autorisation de timeline-refusée Quand je cours le même code non-androïde, cela fonctionne très bien Je suis un peu perplexe Est-ce que android pourrait limiter la connexion réseau Im en utilisant des classes auxiliaires de base de données, ne sont pas inclus le code parce que l'exception est levée avant que ces éléments sont même impliqués: (Heres le code:Android Twitter erreur d'exception :(

import twitter4j.Paging; 
import twitter4j.Status; 
import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.TwitterFactory; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Date; 


import android.app.ListActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
public class TwitterTest extends ListActivity{ 
private ArrayList<String> queryString; 
private DatabaseQuery query; 






/* returns date in string format-without time */ 
String getThisYearDate(Date d){ 
    String x = d.toString(); 
    String y= x.substring(0, 11); 
    String z =x.substring(17); 
    String a = y.concat(z); 
    return a; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    query = new DatabaseQuery(this); 

    /*If file exists then tables in db created successfully*/ 

    File file = new File("exists.txt"); 




    boolean success = file.exists(); 

    if (success==false) { 
    try { 

    ArrayList<Status> statuses = new ArrayList<Status>(); 


    Twitter twitter = new TwitterFactory().getInstance("USERNAME", "PASSWORD"); 



    statuses = twitter.getUserTimeline(); 

    /* adds status data to database*/ 
    for(Status s: statuses){ 

    query.appendData("Text", s.getText()); 
    query.appendData("Date", this.getThisYearDate(s.getCreatedAt())); 
    query.appendData("ID",String.valueOf(s.getId())); 
    query.addRow(); 
    } 



    } 
    catch (TwitterException te) { 
    System.out.println("Failed to get timeline: " + te.getMessage()); 

    System.exit(-1); 
    } 
    try{ 
    boolean created = file.createNewFile(); 
    } 
    catch (IOException e) { 

    System.out.println("error"); 




    } 

    queryString = query.getData(new String[] {"Text"},this.getThisYearDate(new Date()), null, null, null, "Date", " ASC"); 
    try { 
    query.destroy(); 
    } catch (Throwable e) { 
    e.printStackTrace(); 
    } 

    } else { 
    // File already exists 
    queryString = query.getData(new String[] {"Text"},this.getThisYearDate(new Date()), null, null, null, "Date", " ASC"); 
    try { 
    query.destroy(); 
    } catch (Throwable e) { 
    e.printStackTrace(); 
    } 

    } 





// Set the ListView 
setListAdapter(new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, queryString)); 
getListView().setTextFilterEnabled(true); 
} 
} 

Répondre

0

on dirait que vous n'avez pas ajouté l'autorisation android.permission.INTERNET dans votre AndroidManifest.xml.

+0

Merci, j'ai ajouté à mon manifeste. Toujours obtenir le même problème si :( – drunkmonkey

1

Utiliser la tâche asynchrone, cela a fonctionné pour moi

public class Asy extends AsyncTask<String, String, String> { 
static String msg ; 
@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

} 


protected String doInBackground(String... args) { 

    android.tweet(msg); 
    return null; 
} 


protected void onPostExecute(String file_url) { 


} 
} 

où Android est une classe qui contient votre code:

public class android { 
static boolean got = true; 
public static String consumerKey = "************"; 

public static String consumerSecret = "***********"; 

public final static String accesstoken = "***************"; 

public final static String accesstokensecret = "**************"; 

private final String CALLBACKURL = "T4J_OAuth://callback_main"; 

public static void tweet(String s) { 

    ConfigurationBuilder builder = new ConfigurationBuilder(); 
    builder.setOAuthAccessToken(accesstoken); 
    builder.setOAuthAccessTokenSecret(accesstokensecret); 
    builder.setOAuthConsumerKey(consumerKey); 
    builder.setOAuthConsumerSecret(consumerSecret); 
    OAuthAuthorization auth = new OAuthAuthorization(builder.build()); 
    Twitter twitter = new TwitterFactory().getInstance(auth); 

    try { 
twitter.updateStatus(s);  //I was trying to tweet 
     //put whatever you want to do 
    } catch (TwitterException e) { 

     return; 
    } 

} 

ensuite appeler cette tâche asynchrone en utilisant ce code:

Asy.msg = "whatever";  // the status I was posting 
Asy task3 = new Asy(); 
task3.execute();` 

Cela a fonctionné pour moi. Bonne chance

+0

je mis à jour, mais curieux de savoir que les jetons avaient vraiment besoin d'être codés en dur? – nobalG