发布Tweet失败-com.twitter.sdk.android.core.TwitterApiException:403禁止

发布Tweet失败-com.twitter.sdk.android.core.TwitterApiException:403禁止,android,twitter,twitter-oauth,twitter-fabric,Android,Twitter,Twitter Oauth,Twitter Fabric,嗨,我想用最新的推特API发布一条推特,我得到了以下例外 11-26 15:59:07.579 19471-19471/com.pestwitter E/TweetUploadService﹕ Post Tweet failed com.twitter.sdk.android.core.TwitterApiException: 403 Forbidden at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:383)

嗨,我想用最新的推特API发布一条推特,我得到了以下例外

11-26 15:59:07.579 19471-19471/com.pestwitter E/TweetUploadService﹕ Post Tweet failed
com.twitter.sdk.android.core.TwitterApiException: 403 Forbidden
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:383)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
这是我的密码

public class MainActivity extends Activity {

private static final String CONSUMER_KEY ="%%%%%%%%%%%%%";
private static final String CONSUMER_SECRET ="%%%%%%%%%%%%%%%%%%%%%%%%";
public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FORESLASH = "/";
private static final String TAG = "BITMAPS SVE";
private TwitterLoginButton loginButton;
private TwitterAuthClient client;
private Button twitter_logout_button;
private Button twitter_posttweet_button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
/* TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Twitter(authConfig));
client = new TwitterAuthClient();*/
/* TwitterAuthConfig authConfig = new TwitterAuthConfig(CONSUMER_KEY, CONSUMER_SECRET);
Fabric.with(this, new Twitter(authConfig),new Crashlytics());*/
loginButton = (TwitterLoginButton) findViewById(R.id.twitter_login_button);
twitter_logout_button = (Button) findViewById(R.id.twitter_logout_button);
twitter_posttweet_button= (Button) findViewById(R.id.twitter_posttweet_button);

 /*   loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            loginButton.performClick();
        }
    });*/


    if(Twitter.getSessionManager().getActiveSession()!=null)
    {
        Log.e("Active sesion exits","Active sesion exits");
        toggleLoginLogout(true);
    }
    else 
    {
        Log.e("NO Active sesion exits","NO Active sesion exits");

        toggleLoginLogout(false);
    }


    loginButton.setCallback(new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> result) {
            // The TwitterSession is also available through:
            // Twitter.getInstance().core.getSessionManager().getActiveSession()
            if(Twitter.getSessionManager().getActiveSession()!=null)
            {
                Log.e("Active sesion exits","Active sesion exits");
                toggleLoginLogout(true);
            }
            TwitterSession session = result.data;
            // TODO: Remove toast and use the TwitterSession's userID
            // with your app's user model
            String msg = "@" + session.getUserName() + " logged in! (#" + session.getUserId() + ")";
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();



            Bitmap  icon= BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
            storeImage(icon);



            File myImageFile = new File("/storage/emulated/0/Android/data/com.pestwitter/Files/pestwitter.jpg");

            Uri myImageUri = Uri.fromFile(myImageFile);
            final Card card = new Card.AppCardBuilder(MainActivity.this)
                    .imageUri(myImageUri)
                    .googlePlayId("com.pestwitter")
                    .iPhoneId("123456")
                    .iPadId("123456")
                    .build();

            final Intent tweetIntent = new ComposerActivity.Builder(MainActivity.this)
                    .session(session)
                    .card(card)
                    .createIntent();

            ((Activity) MainActivity.this).startActivity(tweetIntent);



        }

        @Override
        public void failure(TwitterException exception) {
            Log.d("TwitterKit", "Login with Twitter failure", exception);
        }
    });



    twitter_logout_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            logout();
            toggleLoginLogout(false);
        }
    });

    twitter_posttweet_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });
}

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    Log.e("getAbsoluteFile",pictureFile.getAbsoluteFile().toString());
    Log.e("getPath",pictureFile.getPath().toString());


    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    }
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 90, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }
}

/** Create a File for saving an image or video */
private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files");



    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }
    // Create a media file name
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
    File mediaFile;
    String mImageName="pestwitter.jpg";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    return mediaFile;
}

void  toggleLoginLogout(boolean status)
{
    if(status)
    {
        //twitter_logout_button.setVisibility(View.VISIBLE);
        loginButton.setVisibility(View.INVISIBLE);
        twitter_posttweet_button.setVisibility(View.VISIBLE);
    }
    else
    {
      //  twitter_logout_button.setVisibility(View.GONE);
        loginButton.setVisibility(View.VISIBLE);
        twitter_posttweet_button.setVisibility(View.INVISIBLE);
    }

}
public static Uri resIdToUri(Context context, int resId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName()
            + FORESLASH + resId);
}
private void logout() {


    CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.removeSessionCookie();
    Twitter.getSessionManager().clearActiveSession();
    Twitter.logOut();


}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Make sure that the loginButton hears the result from any
    // Activity that it triggered.
    loginButton.onActivityResult(requestCode, resultCode, data);
}
}
公共类MainActivity扩展活动{
私有静态最终字符串使用者_KEY=“%;
私有静态最终字符串使用者\u SECRET=“%;
公共静态最终字符串ANDROID_RESOURCE=“ANDROID.RESOURCE://”;
公共静态最终字符串前斜杠=“/”;
私有静态最终字符串标记=“位图SVE”;
私人推特登录按钮登录按钮;
私有twitter客户端;
私有按钮twitter\u注销\u按钮;
私人按钮twitter\u postweet\u按钮;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*TwitterAuthConfig authConfig=新的TwitterAuthConfig(TWITTER\u密钥,TWITTER\u秘密);
Fabric.with(this,newtwitter(authConfig));
client=新TwitterAuthClient()*/
/*TwitterAuthConfig authConfig=新的TwitterAuthConfig(使用者密钥,使用者密钥);
Fabric.with(this,newtwitter(authConfig),newcrashlytics())*/
loginButton=(TwitterLoginButton)findViewById(R.id.twitter_login_按钮);
twitter_logout_button=(button)findviewbyd(R.id.twitter_logout_button);
twitter\u postweet\u按钮=(按钮)findViewById(R.id.twitter\u postweet\u按钮);
/*loginButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
loginButton.performClick();
}
});*/
if(Twitter.getSessionManager().getActiveSession()!=null)
{
Log.e(“活动sesion退出”、“活动sesion退出”);
ToggleLoginLougout(真);
}
其他的
{
Log.e(“无活动sesion退出”,“无活动sesion退出”);
ToggleLoginLougut(假);
}
setCallback(newcallback()){
@凌驾
公开作废成功(结果){
//twitter会话也可通过以下方式获得:
//Twitter.getInstance().core.getSessionManager().getActiveSession()
if(Twitter.getSessionManager().getActiveSession()!=null)
{
Log.e(“活动sesion退出”、“活动sesion退出”);
ToggleLoginLougout(真);
}
TwitterSession=result.data;
//TODO:删除toast并使用TwitterSession的用户ID
//使用应用程序的用户模型
字符串msg=“@”+会话.getUserName()+”已登录!(#“+会话.getUserId()+”);
Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG.show();
位图图标=BitmapFactory.decodeResource(getResources(),R.drawable.ic_启动器);
商店形象(图标);
File myImageFile=新文件(“/storage/emulated/0/Android/data/com.pestwitter/Files/pestwitter.jpg”);
Uri myImageUri=Uri.fromFile(myImageFile);
最终卡=新卡。AppCardBuilder(MainActivity.this)
.imageUri(myImageUri)
.googlePlayId(“com.pestwitter”)
.iPhoneId(“123456”)
.iPadId(“123456”)
.build();
final Intent tweetIntent=new Composer Activity.Builder(MainActivity.this)
.届会(届会)
.卡
.createIntent();
((Activity)MainActivity.this)、startActivity(tweetIntent);
}
@凌驾
公共无效失败(TwitterException异常){
Log.d(“TwitterKit”,“使用TwitterFailure登录”,异常);
}
});
twitter\u logout\u按钮。setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图){
注销();
ToggleLoginLougut(假);
}
});
twitter\u posttweet\u按钮。setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图){
}
});
}
私有void存储图像(位图图像){
File pictureFile=getOutputMediaFile();
Log.e(“getAbsoluteFile”,pictureFile.getAbsoluteFile().toString());
Log.e(“getPath”,pictureFile.getPath().toString());
如果(pictureFile==null){
Log.d(标签,
创建媒体文件时出错,请检查存储权限:”;//e.getMessage());
返回;
}
试一试{
FileOutputStream fos=新的FileOutputStream(pictureFile);
image.compress(Bitmap.CompressFormat.PNG,90,fos);
fos.close();
}catch(filenotfounde异常){
Log.d(标记“未找到文件:”+e.getMessage());
}捕获(IOE异常){
Log.d(标记“访问文件时出错:”+e.getMessage());
}
}
/**创建用于保存图像或视频的文件*/
私有文件getOutputMediaFile(){
//为了安全起见,您应该检查SD卡是否已安装
//在执行此操作之前,请先使用Environment.getExternalStorageState()。
File mediaStorageDir=新文件(Environment.getExternalStorageDirectory()
+“/Android/data/”
+getApplicationContext().getPackageName()
+“/文件”);
//如果希望共享创建的图像,则此位置效果最佳
//在应用程序之间,并在卸载应用程序后保持。
//如果存储目录不存在,请创建该目录
如果(!mediaStorageDir.exists()){
如果(!mediaStorageDir.mkdirs()){
返回null;
}
}
//创建媒体文件名
字符串时间戳=新的SimpleDataFormat(“ddMMyyyy_HHmm”).format(新日期());
文件媒体文件;
字符串mImageName=“pestwitter.jpg”;
mediaFile=新文件(mediaStorageDir.getPath()+File.separator+mImageName);
返回媒体文件;
}
void toggleLoginLogout(布尔状态)
{
如果(状态)
{
//twitter_logout_按钮。设置可见性(View.VISIBLE);
设置可见性(视图不可见);
推特帖子