Post Tweet failed- com.twitter.sdk.android.core.TwitterApiException: 403 Forbidden

android
oauth

#1

Hi im trying to post a tweet and i get the following exception

> 12-03 17:22:59.987: W/BroadcastQueue(563): Permission Denial: broadcasting Intent { act=com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE flg=0x10 (has extras) } from com.infy.pestweet (pid=5465, uid=10270) is not exported from uid 10262 due to receiver com.example.vimek.twittertest/.MyResultReceiver

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)

This is my code

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);
}

}

Can someone help me to identify the issue?

Regards
Vimek

PS:- Please let me know if you want more info


#2

@vimektest,

Where were your Twitter Consumer key and secret generated from?

-Mike


#3

I created the application in https://apps.twitter.com and from the "key and access token " tab ,From there i got the consumer key and secret key


#4