Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Twitter Fabric Android获取追随者列表?_Java_Android_Rest_Twitter - Fatal编程技术网

Java 如何使用Twitter Fabric Android获取追随者列表?

Java 如何使用Twitter Fabric Android获取追随者列表?,java,android,rest,twitter,Java,Android,Rest,Twitter,我想在不使用twitter4j的情况下使用TwitterRESTAPI。Fabric很好,但我找不到像gettingUserFollowers()这样的方法。我不知道为什么会这样。无论如何,我想使用此服务调用我的用户追随者ID 我已经看过fabric网站()的教程。有一个用于获取自定义服务的类。但我不明白如何将其称为发送参数 import com.twitter.sdk.android.core.TwitterApiClient; import com.twitter.sdk.android.c

我想在不使用twitter4j的情况下使用TwitterRESTAPI。Fabric很好,但我找不到像gettingUserFollowers()这样的方法。我不知道为什么会这样。无论如何,我想使用此服务调用我的用户追随者ID

我已经看过fabric网站()的教程。有一个用于获取自定义服务的类。但我不明白如何将其称为发送参数

import com.twitter.sdk.android.core.TwitterApiClient;
import com.twitter.sdk.android.core.TwitterSession;
import retrofit.http.GET;
import retrofit.http.Query;

public class MyTwitterApiClient extends TwitterApiClient  {

    public MyTwitterApiClient(TwitterSession session) {
        super(session);
    }

    public CustomService getCustomService() {
        return getService(CustomService.class);
    }

    interface CustomService {
        @GET("/1.1/followers/ids.json")
        void show(@Query("user_id") long id);
   }
}
我认为当我发送一个id时,服务会带来追随者id

MyTwitterApiClient aa = new MyTwitterApiClient(session);
aa.getCustomService().show(userId);
但应用程序已停止。我怎么了

LogCat是

5897-15897/com.tumymedia.tumer.lylafortwitter E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.tumymedia.tumer.lylafortwitter, PID: 15897
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=140, result=-1, data=Intent { (has extras) }} to activity {com.tumymedia.tumer.lylafortwitter/com.tumymedia.tumer.lylafortwitter.MainActivity}: java.lang.IllegalArgumentException: CustomService.show: Must have either a return type or Callback as last argument.
            at android.app.ActivityThread.deliverResults(ActivityThread.java:4058)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
            at android.app.ActivityThread.access$1400(ActivityThread.java:177)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5942)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
     Caused by: java.lang.IllegalArgumentException: CustomService.show: Must have either a return type or Callback as last argument.
            at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:123)
            at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:285)
            at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:113)
            at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236)
            at java.lang.reflect.Proxy.invoke(Proxy.java:397)
            at com.tumymedia.tumer.lylafortwitter.$Proxy16.show(Unknown Source)
            at com.tumymedia.tumer.lylafortwitter.MainActivity$1.success(MainActivity.java:55)
            at com.twitter.sdk.android.core.identity.TwitterAuthClient$CallbackWrapper.success(TwitterAuthClient.java:230)
            at com.twitter.sdk.android.core.Callback.success(Callback.java:40)
            at com.twitter.sdk.android.core.identity.AuthHandler.handleOnActivityResult(AuthHandler.java:91)
            at com.twitter.sdk.android.core.identity.TwitterAuthClient.onActivityResult(TwitterAuthClient.java:161)
            at com.twitter.sdk.android.core.identity.TwitterLoginButton.onActivityResult(TwitterLoginButton.java:131)
            at com.tumymedia.tumer.lylafortwitter.MainActivity.onActivityResult(MainActivity.java:96)
            at android.app.Activity.dispatchActivityResult(Activity.java:6543)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:4054)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
            at android.app.ActivityThread.access$1400(ActivityThread.java:177)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5942)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
5897-15897/com.tummedia.tumer.lylafortwitter E/AndroidRuntime﹕ 致命异常:主
流程:com.tummedia.tumer.lylafortwitter,PID:15897
java.lang.RuntimeException:向活动{com.tummedia.tumer.lylafortwitter/com.tummedia.tumer.tumer.lylafortwitter.MainActivity}:java.lang.IllegalArgumentException:CustomService.show:必须具有返回类型或回调作为最后一个参数。
位于android.app.ActivityThread.deliverResults(ActivityThread.java:4058)
位于android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
在android.app.ActivityThread.access,售价1400美元(ActivityThread.java:177)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:145)
位于android.app.ActivityThread.main(ActivityThread.java:5942)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1400)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
原因:java.lang.IllegalArgumentException:CustomService.show:必须将返回类型或回调作为最后一个参数。
在Reformation.RestMethodInfo.methodError(RestMethodInfo.java:123)中
位于reformation.RestMethodInfo.parseResponseType(RestMethodInfo.java:285)
RestMethodInfo.(RestMethodInfo.java:113)
在reformation.RestAdapter.getMethodInfo(RestAdapter.java:213)中
在reformation.RestAdapter$RestHandler.invoke(RestAdapter.java:236)处
位于java.lang.reflect.Proxy.invoke(Proxy.java:397)
位于com.tummedia.tumer.lylafortwitter.$Proxy16.show(未知来源)
位于com.tummedia.tumer.lylafortwitter.MainActivity$1.success(MainActivity.java:55)
位于com.twitter.sdk.android.core.identity.TwitterAuthClient$CallbackWrapper.success(TwitterAuthClient.java:230)
访问com.twitter.sdk.android.core.Callback.success(Callback.java:40)
位于com.twitter.sdk.android.core.identity.AuthHandler.handleOnActivityResult(AuthHandler.java:91)
位于com.twitter.sdk.android.core.identity.TwitterAuthClient.onActivityResult(TwitterAuthClient.java:161)
位于com.twitter.sdk.android.core.identity.TwitterLoginButton.onActivityResult(TwitterLoginButton.java:131)
位于com.tummedia.tumer.lylafortwitter.MainActivity.onActivityResult(MainActivity.java:96)
位于android.app.Activity.dispatchActivityResult(Activity.java:6543)
位于android.app.ActivityThread.deliverResults(ActivityThread.java:4054)
位于android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
在android.app.ActivityThread.access,售价1400美元(ActivityThread.java:177)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:145)
位于android.app.ActivityThread.main(ActivityThread.java:5942)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1400)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

为了能够调用API并获得结果,您需要对Twitter进行身份验证。我在这段代码中没有看到这种情况。(也许你是在这个代码之外做的?)

有关Twitter身份验证的详细信息,请访问

实际上,Fabric使用改造来进行RESTAPI调用 在Fabric文档中,为了获得追随者的ID,我们需要通过 用户id作为参数,并在响应中检索列表

MyTwitterApiClient.java

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.TwitterApiClient;
import com.twitter.sdk.android.core.TwitterSession;
import retrofit.client.Response;
import retrofit.http.GET;
import retrofit.http.Query;

    public class MyTwitterApiClient extends TwitterApiClient {
        public MyTwitterApiClient(TwitterSession session) {
            super(session);
        }

        /**
         * Provide CustomService with defined endpoints
         */
        public CustomService getCustomService() {
            return getService(CustomService.class);
        }
    }

    // example users/show service endpoint
    interface CustomService {
        @GET("/1.1/followers/ids.json")
        void list(@Query("user_id") long id, Callback<Response> cb);
    }
import com.twitter.sdk.android.core.Callback;
导入com.twitter.sdk.android.core.twitter客户端;
导入com.twitter.sdk.android.core.twitter会话;
导入reformation.client.Response;
导入reformation.http.GET;
导入reformation.http.Query;
公共类MyTwitterApiClient扩展了TwitterApiClient{
公共MyTwitterApiClient(TwitterSession会话){
超级(会议);
}
/**
*为CustomService提供定义的端点
*/
公共CustomService getCustomService(){
返回getService(CustomService.class);
}
}
//示例用户/显示服务端点
接口定制服务{
@GET(“/1.1/followers/ids.json”)
无效列表(@Query(“user_id”)长id,回调cb);
}
现在在MainActivity中,我们将对用户进行身份验证,然后获取 在会话中,我们将检索对应的所有关注者的列表 对用户ID进行修改

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Note: Your consumer key and secret should be obfuscated in your source code before shipping.
    private static final String TWITTER_KEY = "YOUR_TWITTER_KEY";
    private static final String TWITTER_SECRET = "YOUR_TWITTER_SECRET";
    TwitterLoginButton loginButton;
    SharedPreferences shared;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig), new Crashlytics());
        setContentView(R.layout.activity_main);
        shared = getSharedPreferences("demotwitter", Context.MODE_PRIVATE);
        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
           @Override
           public void success(Result<TwitterSession> result) {
               // Do something with result, which provides a TwitterSession for making API calls
                TwitterSession session = Twitter.getSessionManager()
                        .getActiveSession();
                TwitterAuthToken authToken = session.getAuthToken();
                String token = authToken.token;
                String secret = authToken.secret;

//Here we get all the details of user's twitter account

                System.out.println(result.data.getUserName()
                        + result.data.getUserId());
                Twitter.getApiClient(session).getAccountService()
                        .verifyCredentials(true, false, new Callback<User>() {

                            @Override
                            public void success(Result<User> userResult) {

                                User user = userResult.data;
//Here we get image url which can be used to set as image wherever required.      
                 System.out.println(user.profileImageUrl+" "+user.email+""+user.followersCount);

                            }

                            @Override
                            public void failure(TwitterException e) {

                            }

                        });
                shared.edit().putString("tweetToken", token).commit();
                shared.edit().putString("tweetSecret", secret).commit();
                TwitterAuthClient authClient = new TwitterAuthClient();
                authClient.requestEmail(session, new Callback<String>() {
                    @Override
                    public void success(Result<String> result) {
                        // Do something with the result, which provides the
                        // email address
                        System.out.println(result.toString());
                        Log.d("Result", result.toString());
                        Toast.makeText(getApplicationContext(), result.data,
                                Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void failure(TwitterException exception) {
                        // Do something on failure
                        System.out.println(exception.getMessage());
                    }
                });
                MyTwitterApiClient apiclients=new MyTwitterApiClient(session);
                apiclients.getCustomService().list(result.data.getUserId(), new Callback<Response>() {

                    @Override
                    public void failure(TwitterException arg0) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void success(Result<Response> arg0) {
                        // TODO Auto-generated method stub
                        BufferedReader reader = null;
                        StringBuilder sb = new StringBuilder();
                        try {

                            reader = new BufferedReader(new InputStreamReader(arg0.response.getBody().in()));

                            String line;

                            try {
                                while ((line = reader.readLine()) != null) {
                                    sb.append(line);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }


                        String result = sb.toString();
                    System.out.println("Response is>>>>>>>>>"+result);
                    try {
                        JSONObject obj=new JSONObject(result);
                        JSONArray ids=obj.getJSONArray("ids");
              //This is where we get ids of followers
                        for(int i=0;i<ids.length();i++){
                        System.out.println("Id of user "+(i+1)+" is "+ids.get(i));
                        }
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    }

                });
           }

           @Override
           public void failure(TwitterException exception) {
               // Do something on failure
           }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Pass the activity result to the login button.
        loginButton.onActivityResult(requestCode, resultCode, data);
    }

}
public类MainActivity扩展了AppCompatActivity{
//注意:您的消费者密钥和密码应该在出厂前在源代码中进行模糊处理。
私有静态最终字符串TWITTER\u KEY=”
public interface FollowersService {
        @GET("/1.1/followers/list.json")
        Call<ResponseBody> list(@Query("screen_name") String userId);
}
FollowersService followersService = followersTwitterApiClient.getFollowersService();
        Call<ResponseBody> call = followersService.list(userId);
        call.enqueue(followerCallback);
public class FollowersTwitterApiClient extends TwitterApiClient {

    public FollowersTwitterApiClient(TwitterSession twitterSession){
        super(twitterSession);
    }

    public FollowersService getFollowersService(){
        return getService(FollowersService.class);
    }
}