I'm trying to use FB Connect on my app, and everything works fine in the emulator and debugging in a Galaxy Nexus, but after uploading it to google play it stops working.
If I install the app downloading it from Play, my facebook.authorize function returns a DialogError (I just don't know what error because I'm only able to view logcat when the installation is made with eclipse). And it only happens if I have the facebook app installed. So when I uninstall the fb app it works nice...
Maybe is some wrong configuration I've made while preparing facebook SDK on my computer? I pasted all my code below, but don't have any log...
public class FacebookConnectActivity extends Activity {
private static final String TAG_JSON = "json";
static Facebook facebook = new Facebook("11111111111111");
AsyncFacebookRunner mAsyncRunner;
private static SharedPreferences mPrefs;
JSONObject json = null;
Context ctx = this;
boolean callback = false;
private static Context staticContext;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.resgatar_produto_layout);
FacebookConnectActivity.staticContext = getApplicationContext();
Log.e("FacebookConnect", "Activity Started");
mPrefs = getSharedPreferences("PREFS_LOGIN", MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if (access_token != null) {
facebook.setAccessToken(access_token);
Log.e("FacebookConnect",
"Access Token retrieved from SharedPreferences");
}
if (expires != 0) {
facebook.setAccessExpires(expires);
Log.e("FacebookConnect",
"Access Expires retrieved from SharedPreferences");
}
if (!facebook.isSessionValid()) {
facebook.authorize(this, new String[] { "email", "user_photos",
"user_birthday", "user_hometown", "user_relationships",
"user_location", "user_work_history", "publish_actions" },
new DialogListener() {
#Override
public void onComplete(Bundle values) {
Log.e("FacebookConnect", "User authorized");
Log.e("FacebookConnect",
"onComplete called at facebook.authorize");
Log.e("FacebookConnect", "Access Token: "
+ facebook.getAccessToken().toString());
try {
mAsyncRunner = new AsyncFacebookRunner(facebook);
mAsyncRunner.request("me",
new SampleRequestListener());
Log.e("FacebookConnect",
"AsyncFacebookRunner request started (facebook.authorize.onComplete)");
Bundle params = new Bundle();
params.putString("link",
"https://apps.facebook.com/qranio_game/");
params.putString("picture", "http://www.qranio.com/site/images/logo_qranio_facebook.png");
int count = 0;
while (json == null && count<20){
Log.e("FacebookConnect",
"Waiting for json (facebook.authorize.onComplete)");
waiting(1000);
count++;
}
if (!(count<20)){
noConnectionAlert();
}
String usuario = json.getString("first_name");
params.putString("name", usuario+" está jogando Qranio para Android");
params.putString("caption", "Qranio - Making Learning Fun");
params.putString("description", "O Qranio é uma plataforma online que propicia o Saber. Você joga, " +
"aprende, acumula Qi$ e troca por prêmios incríveis! Venha jogar também!");
//JSONArray fbArr = new JSONArray("{\"name\":\"Jogar\",\"link\":\"https://apps.facebook.com/qranio_game/\"}");
params.putString("actions", "{\"name\":\"Jogar\",\"link\":\"https://apps.facebook.com/qranio_game/\"}");
params.putString("display", "touch");
facebook.dialog(ctx, "feed", params,
new SampleDialogListener());
Log.e("FacebookConnect",
"Post on Wall Dialog called (facebook.authorize.onComplete)");
// facebook.
// if (facebook.isSessionValid()){
// }else{
// Log.e("FacebookConnect",
// "Invalid facebook session while trying to fetch user data");
// }
} catch (FacebookError fbe) {
Log.e("FacebookConnect",
"facebook.authorize FacebookError "
+ fbe.toString());
} catch (Exception e) {
Log.e("FacebookConnect",
"facebook.authorize Exception "
+ e.toString());
}
}
#Override
public void onFacebookError(FacebookError error) {
Log.e("FacebookConnect",
"FacebookError authorizing: "
+ error.toString());
final AlertDialog alertDialog = new AlertDialog.Builder(
FacebookConnectActivity.this).create();
alertDialog.setTitle("Erro");
alertDialog
.setMessage("Ocorreu um erro com o Facebook, por favor tente novamente.");
alertDialog.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
alertDialog.dismiss();
finish();
}
});
alertDialog.show();
}
#Override
public void onError(DialogError e) {
//Here is where I'm getting the error when downloaded from Play
Log.e("FacebookConnect",
"Error authorizing: " + e.toString());
final AlertDialog alertDialog = new AlertDialog.Builder(
FacebookConnectActivity.this).create();
alertDialog.setTitle("Erro");
alertDialog
.setMessage("Erro ao tentar conectar com o facebook, tente novamente.");
alertDialog.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
alertDialog.dismiss();
finish();
}
});
alertDialog.show();
}
#Override
public void onCancel() {
Log.e("FacebookConnect", "Autorizing canceled");
finish();
}
});
} else {
mAsyncRunner = new AsyncFacebookRunner(facebook);
mAsyncRunner.request("me", new SampleRequestListener());
Log.e("FacebookConnect",
"Valid session found, AsyncFacebookRunner request started");
startDataProcess();
}
}
public void noConnectionAlert(){
final AlertDialog alertDialog = new AlertDialog.Builder(
FacebookConnectActivity.this).create();
alertDialog.setTitle("Erro");
alertDialog
.setMessage("Verifique sua conexão com a internet e tente novamente.");
alertDialog.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
alertDialog.dismiss();
finish();
}
});
alertDialog.show();
}
public static void waiting (int n){
long t0, t1;
t0 = System.currentTimeMillis();
do{
t1 = System.currentTimeMillis();
}
while (t1 - t0 < n);
}
public static void logoutFB() {
if (facebook.isSessionValid()) {
Log.e("AndroidDashboarDesign",
"Valid FB session found, logging out");
AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
mAsyncRunner.logout(staticContext, new BaseRequestListener() {
#Override
public void onComplete(String response, Object state) {
Log.e("AndroidDashboarDesign", "Complete FB logout");
}
#Override
public void onIOException(IOException e, Object state) {
Log.e("AndroidDashboarDesign",
"(logout) IOException: " + e.getMessage());
}
#Override
public void onFileNotFoundException(FileNotFoundException e,
Object state) {
Log.e("AndroidDashboarDesign",
"(logout) FileNotFoundException: " + e.getMessage());
}
#Override
public void onMalformedURLException(MalformedURLException e,
Object state) {
Log.e("AndroidDashboarDesign",
"(logout) MalFormedURLException: " + e.getMessage());
}
#Override
public void onFacebookError(FacebookError e, Object state) {
Log.e("AndroidDashboarDesign", "(logout) FacebookError: "
+ e.getMessage());
}
});
}
}
public void startDataProcess() {
int count = 0;
while (json == null && count<20){
Log.e("FacebookConnect",
"Waiting for json (Valid session found)");
waiting(1000);
count++;
}
if (!(count<20)){
noConnectionAlert();
}else{
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
Log.e("FacebookConnect", "startDataProcess() executed");
Intent a = new Intent(FacebookConnectActivity.this,
FacebookDataProcess.class);
a.putExtra(TAG_JSON, json.toString());
startActivity(a);
finish();
}
}
public class SampleDialogListener extends BaseDialogListener {
public void onComplete(Bundle values) {
Log.e("FacebookConnect", "SampleDialogListener complete");
final String postId = values.getString("post_id");
if (postId != null) {
Log.e("FacebookConnect",
"(SampleDialogListener) Dialog Success! post_id="
+ postId);
//mAsyncRunner.request(postId, new WallPostRequestListener());
//Log.e("FacebookConnect", "WallPostRequestListener started");
Toast.makeText(FacebookConnectActivity.this, "Mensagem postada com sucesso!", Toast.LENGTH_LONG).show();
startDataProcess();
} else {
Log.e("FacebookConnect",
"(SampleDialogListener) No wall post made, maybe canceled by user."); // Usuario
// clicou
// em
// Cancelar
startDataProcess();
}
}
public void onError(DialogError e) {
Log.e("FacebookConnect",
"Error authorizing: " + e.toString());
final AlertDialog alertDialog = new AlertDialog.Builder(
FacebookConnectActivity.this).create();
alertDialog.setTitle("Erro");
alertDialog
.setMessage("Erro ao tentar conectar com o facebook, não foi possível publicar em seu mural.");
alertDialog.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
startDataProcess();
alertDialog.dismiss();
}
});
alertDialog.show();
}
public void onCancel() { // Usuario clicou no X do dialog
Log.e("FacebookConnect", "Post to Wall Canceled with \"X\" button");
startDataProcess();
}
}
public class WallPostRequestListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
Log.e("FacebookConnect", "WallPostRequestListener complete");
Log.e("FacebookConnect", "(WallPostRequestListener) Got response: "
+ response);
String message = "<empty>";
try {
JSONObject json = Util.parseJson(response);
message = json.getString("message");
} catch (JSONException e) {
Log.e("FacebookConnect",
"(WallPostRequestListener) JSON Error in response: "
+ e.toString());
} catch (FacebookError e) {
Log.e("FacebookConnect",
"(WallPostRequestListener) Facebook Error: "
+ e.getMessage());
// Toast.makeText(ctx, "Erro ao postar no Facebook.",
// Toast.LENGTH_LONG).show();
}
startDataProcess();
}
}
public class SampleRequestListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
try {
// process the response here: executed in background thread
Log.e("FacebookConnect", "SampleRequestListener complete");
Log.e("SampleRequestListener",
"Response: " + response.toString());
json = Util.parseJson(response);
Log.e("FacebookConnect", "JSON: " + json.toString());
// postOnWall();
// startDataProcess();
// then post the processed result back to the UI thread
// if we do not do this, an runtime exception will be generated
// e.g. "CalledFromWrongThreadException: Only the original
// thread that created a view hierarchy can touch its views."
} catch (JSONException e) {
Log.e("FacebookConnect",
"JSON Error in response (SampleRequestListener): "
+ e.getMessage());
} catch (FacebookError e) {
Log.e("FacebookConnect",
"Facebook Error at SampleRequestListener: "
+ e.getMessage());
}
}
}
public void postOnWall() {
Looper.prepare();
Bundle params = new Bundle();
params.putString("link", "www.qranio.com");
facebook.dialog(ctx, "feed", params, new SampleDialogListener());
Log.e("FacebookConnect", "SampleDialogListener started");
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
callback = true;
Log.e("FacebookConnect",
"Authentication authorizeCallback called (onActivityResult)");
}
}
You used a different keystore file when you signed your application for distribution.
To fix this, run the same command but change the alias and the location of the keystore to the keystore file that you used for distribution
keytool -exportcert -alias YOUR_ALIAS_HERE -keystore ~/path/to/yourapp.keystore | openssl sha1 -binary | openssl base64
and paste the resulting string into your Facebook app's dashboard settings under the Android Key Hash section.
Related
I want to import facebook birthdays of my friends to my app. Currently my app is capable of creating new birthday events. But its very long procedure to add each and every birthday, so instead I want a code to import all facebook friends birthdays to my app. I have used facebook session but get nothing much till now
facebook = new Facebook(Constants.FB_APP_ID);
Session session = new Session(getApplicationContext());
if (session.isOpened()) {
Toast.makeText(getApplicationContext(), session.getState().toString(),
Toast.LENGTH_LONG).show();
} else
Toast.makeText(getApplicationContext(), session.getState().toString(),
Toast.LENGTH_LONG).show();
fbRunner = new AsyncFacebookRunner(facebook);
Also i have created a request
private void importBirthdayFromFB() {
Toast.makeText(getApplicationContext(), "Clicked on fb button",
Toast.LENGTH_LONG).show();
fbRunner.request("maxparera/friends", new RequestListener() {
#SuppressWarnings("unchecked")
#Override
public void onComplete(String response, Object state) {
String keys = "";
try {
JSONObject profile = new JSONObject(response);
// getting name of the user
Iterator<String> keysIterator = profile.keys();
if (keysIterator != null) {
while (keysIterator.hasNext()) {
keys += keysIterator.next().toString();
}
Toast.makeText(getApplicationContext(), keys, Toast.LENGTH_LONG).show();
}
final String name = profile.getString("name");
// getting name of the user
Toast.makeText(getApplicationContext(), Name: " + name, Toast.LENGTH_LONG).show();
} catch (final JSONException e) {
e.printStackTrace();
} catch (final Exception e) {
e.printStackTrace();
}
}
});
But I am not getting any name, instead getting exception, sating OAuthException
Please suggest me ASAP
Maybe your session dont have permission to get your friend's birthday.
You can request permission like below:
LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
authButton.setFragment(this);
authButton.setReadPermissions(Arrays.asList("user_friends, read_friendlists));
Layout file:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.facebook.widget.LoginButton
android:id="#+id/authButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
/>
</LinearLayout>
Note: I uses Facebook SDK 3.8, you can refer to its sample for more detail.
LoginButton is a component of Facebook SDK.
For full of my code:
public class MainFragment extends Fragment {
private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
#Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
Log.i(TAG, "session: " +session.toString());
Log.i(TAG, "state: " +state.toString());
if(exception!=null)
Log.i(TAG, "exception: " +exception.toString());
}
};
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
#Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main, container, false);
LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
authButton.setFragment(this);
//REQUEST PERMISSION
authButton.setReadPermissions(Arrays.asList("user_friends, read_friendlists));
return view;
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
try{
Log.i(TAG, "Logged in...");
Log.i(TAG, "Execute my request");
Request r = new Request(session,"/me/friendlists",null,HttpMethod.GET,new Request.Callback() {
public void onCompleted(Response response) {
Log.i(TAG, "onCompleted");
try {
//I HAD FRIEND LIST
Log.i(TAG, "FRIEND: " + response.getGraphObject().toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
);
r.executeAsync();
Log.i(TAG, "Finish my request");
}catch (Exception ex){
Log.e(TAG, ex.getMessage());
}
} else if (state.isClosed()) {
try{
}
catch(Exception ex){
ex.printStackTrace();
}
Log.i(TAG, "Logged out...");
}
}
#Override
public void onResume() {
super.onResume();
// For scenarios where the main activity is launched and user
// session is not null, the session state change notification
// may not be triggered. Trigger it if it's open/closed.
Session session = Session.getActiveSession();
if (session != null &&
(session.isOpened() || session.isClosed()) ) {
onSessionStateChange(session, session.getState(), null);
}
uiHelper.onResume();
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
}
I am trying to login into the Facebook using Facebook sdk .But it not logging in .Its opening the dialog box but after getting the credentials its not working . If i install the Facebook app it opens the Facebook app but login is not completed i cant get the token and user id . I cant post the message to the wall also . But it displays the toast that "message successfully displayed" but it is not posted in the Facebook wall.
Code:
public boolean isSession() {
access_token = sp.getString(TOKEN, "x");
expires = sp.getLong(EXPIRES, -1);
Log.d("TAG", access_token);
if (access_token != null && expires != -1) {
facebook.setAccessToken(access_token);
facebook.setAccessExpires(expires);
}
return facebook.isSessionValid();
}
private class LoginDialogListener implements DialogListener {
#Override
public void onComplete(Bundle values) {
Log.d("TAG", "LoginONComplete");
token =facebook.getAccessToken();
token_expires = facebook.getAccessExpires();
Log.d("TAG", "AccessToken: " + token);
Log.d("TAG", "AccessExpires: " + token_expires);
savePrefs3(EXPIRES,token_expires);
savePrefs(TOKEN,token);
mAsyncRunner.request("me", new IDRequestListener());
}
#Override
public void onFacebookError(FacebookError e) {
Log.d("TAG", "FacebookError: " + e.getMessage());
}
#Override
public void onError(DialogError e) {
Log.d("TAG", "Error: " + e.getMessage());
}
#Override
public void onCancel() {
Log.d("TAG", "OnCancel");
}
}
private class IDRequestListener implements RequestListener {
#Override
public void onComplete(String response, Object state) {
try {
Log.d("TAG", "IDRequestONComplete");
Log.d("TAG", "Response: " + response.toString());
JSONObject json = Util.parseJson(response);
Uid = json.getString("id");
savePrefs("UID", Uid);
final String name = json.getString("name");
} catch (JSONException e) {
Log.d("TAG", "JSONException: " + e.getMessage());
} catch (FacebookError e) {
Log.d("TAG", "FacebookError: " + e.getMessage());
}
}
#Override
public void onIOException(IOException e, Object state) {
// TODO Auto-generated method stub
}
#Override
public void onFileNotFoundException(FileNotFoundException e, Object state) {
// TODO Auto-generated method stub
}
#Override
public void onMalformedURLException(MalformedURLException e, Object state) {
// TODO Auto-generated method stub
}
#Override
public void onFacebookError(FacebookError e, Object state) {
// TODO Auto-generated method stub
}
}
public void postToWall(String message){
Bundle parameters = new Bundle();
parameters.putString("message", message);
parameters.putString("description", "topic share");
try {
facebook.request("me");
String response = facebook.request("me/feed", parameters, "POST");
Log.d("Tests", "got response: " + response);
if (response == null || response.equals("") ||
response.equals("false")) {
showToast("Blank response.");
} else {
showToast("Message posted to your facebook wall!");
}
finish();
} catch (Exception e) {
howToast("Failed to post to wall!");
e.printStackTrace();
finish();
}
}
private void showToast(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
please tell me where i am going wrong . after displaying a toast app gets closed. while loading the fb dialog if i touch the screen it either reloads or switching back to the app window.
Please give immediate reply
The Facebook object is depreciated.You can use the following code in your activity oncreate() method.
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// setContentView(R.layout.facebook_dialog);
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
#Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
#Override
public void onCompleted(GraphUser user, Response response) {
if (user == null) {
Toast.makeText(LoginFacebook.this.getApplicationContext(),
"Facebook Error",
Toast.LENGTH_LONG).show();
finish();
}
else
{
Toast.makeText(LoginFacebook.this.getApplicationContext(),
user.getName()+" Logged in Successfully.",
T
Toast.LENGTH_LONG).show();
finish();
}
//login_fb.setEnabled(true);
//progress.setVisibility(View.INVISIBLE);
}
});
}
}
});
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
finish();
}
And use the following code in the Manifest.xml file under the application tag.
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="#string/app_id" />
<activity
android:name="com.facebook.LoginActivity"
android:label="#string/app_name" >
</activity>
After Loging in to post to wall you have to call this method...
private void publishStory(String user) {
try {
Session session = Session.getActiveSession();
if (session != null){
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
return;
}
Bundle postParams = new Bundle();
postParams.putString("message", messageToPost);
Request.Callback callback= new Request.Callback() {
public void onCompleted(Response response) {
JSONObject graphResponse = response
.getGraphObject()
.getInnerJSONObject();
String postId = null;
try {
postId = graphResponse.getString("id");
} catch (Exception e) {
Log.i("Test",
"JSON error "+ e.getMessage());
}
FacebookRequestError error = response.getError();
if (error != null) {
Toast.makeText(ShareOnFacebook.this
.getApplicationContext(),
error.getErrorMessage(),
Toast.LENGTH_SHORT).show();
} else {
progress.setVisibility(View.INVISIBLE);
toastmessage="Posted Successfully";
Toast.makeText(ShareOnFacebook.this
.getApplicationContext(),
toastmessage,
Toast.LENGTH_SHORT).show();
}
}
};
Request request = new Request(session, user+"/feed", postParams,
HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
}
} catch (Exception e) {
// TODO Auto-generated catch block
Toast.makeText(ShareOnFacebook.this
.getApplicationContext(),
"Facebook Error",
Toast.LENGTH_SHORT).show();
}
}
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
and declare the variables as..
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions","manage_pages","publish_stream");
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
private boolean pendingPublishReauthorization = false;
Not exactly the answer to your question, but if you are starting to develop your app: usage of Facebook object is deprecated in 3.x API.
In new API you should use Session object, along with UiLifecycleHelper
Its strange that I am using right code to make dialog with predefined content. But it isn't working :( guide me if I am wrong, thanks
Code:
Bundle params = new Bundle();
params.putString("message", "Predef Message");
Facebook facebook = new Facebook("APP_ID");
facebook.dialog(this, "feed", params, new DialogListener(){
#Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
}
#Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
}
#Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
}
#Override
public void onCancel() {
return;
}});
I found that we can't predefined a message for posting on wall, check this https://developers.facebook.com/docs/reference/androidsdk/dialog/ it requires user interaction
Message for Post on wall, Share a link or any else require user interaction. So a workaround is share a link and add description to it :)
Try this it is work for me
public void postfb() {
Log.i("PostFB", "POST FB ENTERED..!!");
Facebook facebook;
// facebook = new Facebook(InfrqncyApplication.APP_ID);
facebook = new Facebook(APP_ID);
// replace APP_API_ID with your own
facebook.authorize(getActivity(), new String[] { "publish_stream",
"offline_access" }, null);
Bundle params = new Bundle();
params.putString("link", imagePostPath);
params.putString("name", etxtTitle.getText().toString().trim());
// params.putString("caption","Via Sharesi.es");
params.putString("description", etxtDescription.getText().toString());
params.putString("picture", imagePostPath);
facebook.dialog(getActivity(), "stream.publish", params,
new DialogListener() {
#Override
public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
Toast.makeText(getActivity(),
"Posted sucessfully !", Toast.LENGTH_SHORT)
.show();
AddPost();
} else {
Log.d("FB Sample App", "Canceled by User");
}
}
#Override
public void onFacebookError(FacebookError error) {
AddPost();
Log.e("fb", "fb error" + error);
}
#Override
public void onError(DialogError e) {
AddPost();
Log.e("fb", "fb dialog error" + e.getLocalizedMessage());
}
#Override
public void onCancel() {
AddPost();
}
});
}
I make an application in which I make an EditText and a button. I want to be post that message which is written on EditText on the Facebook friends wall after clicked on the button. Please give me some idea how we can perform this task using Facebook sdk.
The code is below:
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.post_wall);
share = (Button) findViewById(R.id.share);
friend_name = (TextView) findViewById(R.id.wall_to);
wall = (EditText) findViewById(R.id.wall);
savedInstanceState = new Bundle();
savedInstanceState.getString("to");
onComplete(savedInstanceState);
}
#Override public void onComplete(Bundle values)
{
Utility.currentPermissions.clear();
if (values.isEmpty())
{
//"skip" clicked ?
return;
}
// if facebookClient.authorize(...) was successful, this runs
// this also runs after successful post
// after posting, "to"(which is the id of friend) is added to the values bundle
// I use that to differentiate between a call from
// faceBook.authorize(...) and a call from a successful post
// is there a better way of doing this?
if (!values.containsKey("to"))
{
try
{
Log.d("Wall try", "Click successfully");
for (String key : parameters.keySet()) {
if (parameters.getByteArray(key) != null) {
parameters.putByteArray(key, parameters.getByteArray(key));
Log.d("key", parameters.getByteArray(key).toString());
}
}
mHandler.post(new Runnable() {
#Override
public void run() {
performActivityInfo();
}
});
}
catch (Exception e)
{
// TODO: handle exception
System.out.println(e.getMessage());
}
}
}
protected void performActivityInfo() {
Log.d("perform wall", "Perform Activity");
mHandler.sendEmptyMessage(FRIEND_WALL);
parameters.putString("message", wall.getText().toString());
facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call
Log.d("Wall post", "Click successfully");
}
public Handler mHandler = new Handler() {
#Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FRIEND_WALL:
Log.d("Handler WALL", "Handler");
postOnWall(wall.getText().toString());
break;
}
super.handleMessage(msg);
}
};
#Override
public void onError(DialogError e)
{
System.out.println("Error: " + e.getMessage());
}
#Override
public void onFacebookError(FacebookError e)
{
System.out.println("Error: " + e.getMessage());
}
#Override
public void onCancel()
{
}
#Override
public void onClick(View v)
{
facebookClient = new Facebook(APP_ID);
// replace APP_API_ID with your own
Log.d("Wall click", "Click successfully");
facebookClient.authorize(this,
new String[] {"publish_stream", "read_stream", "offline_access"}, this);
}
public void postOnWall(String msg) {
Log.d("Tests", "Testing graph API wall post");
try {
String response = facebookClient.request("me");
Bundle parameters = new Bundle();
parameters.putString("message", msg);
parameters.putString("description", "test test test");
response = facebookClient.request("me/feed", parameters,
"POST");
Log.d("Tests", "got response: " + response);
if (response == null || response.equals("") ||
response.equals("false")) {
Log.v("Error", "Blank response");
}
} catch(Exception e) {
e.printStackTrace();
}
}
Thanks in Advance.
For getting the value from Edit Text just use :
EditText edittext;
edittext.getEditableText().toString();
Inside Button click Listener use this code then
button.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View arg0) {
String entered_value=edittext.getEditableText().toString();
try{
parameters.putString("message", entered_value);
parameters.putString("target_id", "XXXXX"); // target Id in which you need to Post
parameters.putString("method", "stream.publish");
String response = authenticatedFacebook.request(parameters);
Log.v("response", response);
}
catch(Exception e){}
}
});
where button is your button Object.
I just used a code for camera application in android. In this application, the photo that clicked is saved in to SD Card.My code for saving as shown bellow $
Camera.PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera)
{
FileOutputStream outStream = null;
try
{
outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
outStream.write(data);
outStream.close();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
Log.d(TAG, "on pictureTaken" + data.length);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{}
Log.d(TAG, "on pictureTaken-jpeg");
}
};
I just upload that image from sd card to facebook by using another activity by using FacebookSDK as shown bellow.
public class Upload extends Activity implements OnItemClickListener
{
/* Your Facebook Application ID must be set before running this example
* See http://www.facebook.com/developers/createapp.php
*/
public static final String APP_ID = "146770088755283";
private LoginButton mLoginButton;
private TextView mText;
private ImageView mUserPic;
private Handler mHandler;
ProgressDialog dialog;
final int AUTHORIZE_ACTIVITY_RESULT_CODE = 0;
final int PICK_EXISTING_PHOTO_RESULT_CODE = 1;
private ListView list;
String[] main_items = {"Upload Photo"};
String[] permissions = {"offline_access", "publish_stream", "user_photos", "publish_checkins", "photo_upload"};
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (APP_ID == null)
{
Util.showAlert(this, "Warning", "Facebook Applicaton ID must be " +
"specified before running this example: see FbAPIs.java");
return;
}
setContentView(R.layout.main);
mHandler = new Handler();
mText = (TextView) Upload.this.findViewById(R.id.txt);
mUserPic = (ImageView)Upload.this.findViewById(R.id.user_pic);
//Create the Facebook Object using the app id.
Utility.mFacebook = new Facebook(APP_ID);
//Instantiate the asynrunner object for asynchronous api calls.
Utility.mAsyncRunner = new AsyncFacebookRunner(Utility.mFacebook);
mLoginButton = (LoginButton) findViewById(R.id.login);
//restore session if one exists
SessionStore.restore(Utility.mFacebook, this);
SessionEvents.addAuthListener(new FbAPIsAuthListener());
SessionEvents.addLogoutListener(new FbAPIsLogoutListener());
/*
* Source Tag: login_tag
*/
mLoginButton.init(this, AUTHORIZE_ACTIVITY_RESULT_CODE, Utility.mFacebook, permissions);
if(Utility.mFacebook.isSessionValid())
{
requestUserData();
}
list = (ListView)findViewById(R.id.main_list);
list.setOnItemClickListener(this);
list.setAdapter(new ArrayAdapter<String>(this, R.layout.main_list_item, main_items));
}
#Override
public void onResume()
{
super.onResume();
if(Utility.mFacebook != null && !Utility.mFacebook.isSessionValid())
{
mText.setText("You are logged out! ");
mUserPic.setImageBitmap(null);
}
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode)
{
/*
* if this is the activity result from authorization flow, do a call back to authorizeCallback
* Source Tag: login_tag
*/
case AUTHORIZE_ACTIVITY_RESULT_CODE:
{
Utility.mFacebook.authorizeCallback(requestCode, resultCode, data);
break;
}
/*
* if this is the result for a photo picker from the gallery, upload the image after scaling it.
* You can use the Utility.scaleImage() function for scaling
*/
case PICK_EXISTING_PHOTO_RESULT_CODE:
{
if (resultCode == Activity.RESULT_OK)
{
Uri photoUri = data.getData();
if(photoUri != null) {
Bundle params = new Bundle();
try
{
params.putByteArray("photo", Utility.scaleImage(getApplicationContext(), photoUri));
} catch (IOException e)
{
e.printStackTrace();
}
params.putString("caption", "FbAPIs Sample App photo upload");
Utility.mAsyncRunner.request("me/photos", params, "POST", new PhotoUploadListener(), null);
}
else
{
Toast.makeText(getApplicationContext(), "Error selecting image from the gallery.", Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(getApplicationContext(), "No image selected for upload.", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
switch(position)
{
/*
* Source Tag: upload_photo
* You can upload a photo from the media gallery or from a remote server
* How to upload photo: https://developers.facebook.com/blog/post/498/
*/
case 0:
{
if(!Utility.mFacebook.isSessionValid())
{
Util.showAlert(this, "Warning", "You must first log in.");
}
else
{
dialog = ProgressDialog.show(Upload.this, "", getString(R.string.please_wait), true, true);
new AlertDialog.Builder(this)
.setTitle(R.string.gallery_title)
.setMessage(R.string.gallery_msg)
.setPositiveButton(R.string.gallery_button, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
Intent intent = new Intent(Intent.ACTION_PICK, (MediaStore.Images.Media.EXTERNAL_CONTENT_URI));
startActivityForResult(intent, PICK_EXISTING_PHOTO_RESULT_CODE);
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface d) {
dialog.dismiss();
}
})
.show();
}
break;
}
}
}
/*
* callback for the feed dialog which updates the profile status
*/
public class UpdateStatusListener extends BaseDialogListener {
public void onComplete(Bundle values) {
final String postId = values.getString("post_id");
if (postId != null) {
new UpdateStatusResultDialog(Upload.this, "Update Status executed", values).show();
} else {
Toast toast = Toast.makeText(getApplicationContext(), "No wall post made", Toast.LENGTH_SHORT);
toast.show();
}
}
public void onFacebookError(FacebookError error) {
Toast.makeText(getApplicationContext(), "Facebook Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
public void onCancel() {
Toast toast = Toast.makeText(getApplicationContext(), "Update status cancelled", Toast.LENGTH_SHORT);
toast.show();
}
}
/*
* callback for the apprequests dialog which sends an app request to user's friends.
*/
public class AppRequestsListener extends BaseDialogListener {
public void onComplete(Bundle values) {
Toast toast = Toast.makeText(getApplicationContext(), "App request sent", Toast.LENGTH_SHORT);
toast.show();
}
public void onFacebookError(FacebookError error) {
Toast.makeText(getApplicationContext(), "Facebook Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
public void onCancel() {
Toast toast = Toast.makeText(getApplicationContext(), "App request cancelled", Toast.LENGTH_SHORT);
toast.show();
}
}
/*
* callback for the photo upload
*/
public class PhotoUploadListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
dialog.dismiss();
mHandler.post(new Runnable() {
public void run() {
new UploadPhotoResultDialog(Upload.this, "Upload Photo executed", response).show();
}
});
}
public void onFacebookError(FacebookError error) {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "Facebook Error: " + error.getMessage(), Toast.LENGTH_LONG).show();
}
}
public class FQLRequestListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
mHandler.post(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Response: " + response, Toast.LENGTH_LONG).show();
}
});
}
public void onFacebookError(FacebookError error) {
Toast.makeText(getApplicationContext(), "Facebook Error: " + error.getMessage(), Toast.LENGTH_LONG).show();
}
}
/*
* Callback for fetching current user's name, picture, uid.
*/
public class UserRequestListener extends BaseRequestListener {
public void onComplete(final String response, final Object state) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(response);
final String picURL = jsonObject.getString("picture");
final String name = jsonObject.getString("name");
Utility.userUID = jsonObject.getString("id");
mHandler.post(new Runnable() {
public void run() {
mText.setText("Welcome " + name + "!");
mUserPic.setImageBitmap(Utility.getBitmap(picURL));
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
}
/*
* The Callback for notifying the application when authorization
* succeeds or fails.
*/
public class FbAPIsAuthListener implements AuthListener {
public void onAuthSucceed() {
requestUserData();
}
public void onAuthFail(String error) {
mText.setText("Login Failed: " + error);
}
}
/*
* The Callback for notifying the application when log out
* starts and finishes.
*/
public class FbAPIsLogoutListener implements LogoutListener {
public void onLogoutBegin() {
mText.setText("Logging out...");
}
public void onLogoutFinish() {
mText.setText("You have logged out! ");
mUserPic.setImageBitmap(null);
}
}
/*
* Request user name, and picture to show on the main screen.
*/
public void requestUserData() {
mText.setText("Fetching user name, profile pic...");
Bundle params = new Bundle();
params.putString("fields", "name, picture");
Utility.mAsyncRunner.request("me", params, new UserRequestListener());
}
/**
* Definition of the list adapter
*/
public class MainListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public MainListAdapter() {
mInflater = LayoutInflater.from(Upload.this.getBaseContext());
}
public int getCount() {
return main_items.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
View hView = convertView;
if(convertView == null) {
hView = mInflater.inflate(R.layout.main_list_item, null);
ViewHolder holder = new ViewHolder();
holder.main_list_item = (TextView) hView.findViewById(R.id.main_api_item);
hView.setTag(holder);
}
ViewHolder holder = (ViewHolder) hView.getTag();
holder.main_list_item.setText(main_items[position]);
return hView;
}
}
class ViewHolder {
TextView main_list_item;
}
}
I want to upload that photo to facebook without save to SD Card and from the same activity that photo clicked. If anyone knows about it, please help me....
It is not possible in your case. The reason looks to be you are using native camera to capture a snap.So by default your snap will be saved to sdcard in the default location. There is no way you can stop it. But still you can delete the image after it is captured using the data returned from the Activity Result.