I am new to the facebook sdk, so I am not really too sure why I am getting this error. I have narrowed it down to this section:
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS);
Here>> session.requestNewPublishPermissions(newPermissionsRequest); <<Here
return;
} //this code is located below in the publishStory() method
I followed both the Authenticate tutorial, and the Publish Feed tutorial exactly as is, with a bit of reordering to suit my needs. I am not sure what I could have possibly missed. I will post the SelectionFragment class, which I put the post status stuff to because its where a user is logged in. Just to make sure this is clear, logging in works perfectly. But when I try to click post status it does nothing. The second time I click it, it crashes. Any explanation would be most appreciated.
public class SelectionFragment extends Fragment{
private static final int REAUTH_ACTIVITY_CODE = 100;
private ProfilePictureView profilePictureView;
private TextView userNameView;
private UiLifecycleHelper uiHelper;
private Button shareButton;
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
protected static final String TAG = "SelectionFragment.java";
private boolean pendingPublishReauthorization = false;
private Session.StatusCallback callback = new Session.StatusCallback() {
#Override
public void call(final Session session, final SessionState state, final Exception exception) {
onSessionStateChange(session, state, exception);
}
};
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}//end of onCreate()
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.selection, container, false);
// Find the user's profile picture custom view
profilePictureView = (ProfilePictureView) view.findViewById(R.id.selection_profile_pic);
profilePictureView.setCropped(true);
// Find the user's name view
userNameView = (TextView) view.findViewById(R.id.selection_user_name);
//find the share button
shareButton = (Button) view.findViewById(R.id.shareButton);
shareButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
publishStory();
}
});
// Check for an open session
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
// Get the user's data
makeMeRequest(session);
}
if (savedInstanceState != null) {
pendingPublishReauthorization =
savedInstanceState.getBoolean(PENDING_PUBLISH_KEY, false);
}
return view;
}//end of onCreateView
/*
* Private method that requests users data
* */
private void makeMeRequest(final Session session) {
// Make an API call to get user data and define a
// new callback to handle the response.
Request request = Request.newMeRequest(session,
new Request.GraphUserCallback() {
#Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successful
if (session == Session.getActiveSession()) {
if (user != null) {
// Set the id for the ProfilePictureView
// view that in turn displays the profile picture.
profilePictureView.setProfileId(user.getId());
// Set the Textview's text to the user's name.
userNameView.setText(user.getName());
}
}
if (response.getError() != null) {
// Handle errors, will do so later.
}
}
});
request.executeAsync();
}
/*
* private method that will respond to session changes and call
* the makeMeRequest() method if the session's open
* */
private void onSessionStateChange(final Session session, SessionState state, Exception exception) {
if (session != null && session.isOpened()) {
// Get the user's data.
makeMeRequest(session);
}
/*The following checks if user is logged in and hides or shows the share button*/
if (state.isOpened()) {
shareButton.setVisibility(View.VISIBLE);
if (pendingPublishReauthorization &&
state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
pendingPublishReauthorization = false;
publishStory();
}
} else if (state.isClosed()) {
shareButton.setVisibility(View.INVISIBLE);
}
}//end of onSessionStateChanged
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REAUTH_ACTIVITY_CODE) {
uiHelper.onActivityResult(requestCode, resultCode, data);
}
}
#Override
public void onResume() {
super.onResume();
uiHelper.onResume();
}
#Override
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization);
uiHelper.onSaveInstanceState(bundle);
}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
/*
* What actually publishes the status update
* */
private void publishStory() {
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("name", "Facebook SDK for Android");
postParams.putString("caption", "Build great social apps and get more installs.");
postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
postParams.putString("link", "https://developers.facebook.com/android");
postParams.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");
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 (JSONException e) {
Log.i(TAG,
"JSON error "+ e.getMessage());
}
FacebookRequestError error = response.getError();
if (error != null) {
Toast.makeText(getActivity()
.getApplicationContext(),
error.getErrorMessage(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity()
.getApplicationContext(),
postId,
Toast.LENGTH_LONG).show();
}
}
};
Request request = new Request(session, "me/feed", postParams,
HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
}
}//end of publishStory
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
}//end of class
Edit
Ok so I was able to finally post, but now I have figured out why its crashing still. The last method in the above class, isSubset seems to always return false, meaning it will always run, even if the publish permission was already created.
Edit 2
public class FacebookFrag extends FragmentActivity {
private static final int SPLASH = 0;
private static final int SELECTION = 1;
private static final int SETTINGS = 2;
private static final int FRAGMENT_COUNT = SETTINGS +1;
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
private MenuItem settings;
//flag that indicates a visible activity
private boolean isResumed = false;
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback =
new Session.StatusCallback() {
#Override
public void call(Session session,
SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.facebook_layout);
FragmentManager fm = getSupportFragmentManager();
fragments[SPLASH] = fm.findFragmentById(R.id.splashFragment);
fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment);
fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment);
FragmentTransaction transaction = fm.beginTransaction();
for(int i = 0; i < fragments.length; i++) {
transaction.hide(fragments[i]);
}
transaction.commit();
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
}
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
for (int i = 0; i < fragments.length; i++) {
if (i == fragmentIndex) {
transaction.show(fragments[i]);
} else {
transaction.hide(fragments[i]);
}
}
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
// Only make changes if the activity is visible
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
// Get the number of entries in the back stack
int backStackSize = manager.getBackStackEntryCount();
// Clear the back stack
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
if (state.isOpened()) {
// If the session state is open:
// Show the authenticated fragment
showFragment(SELECTION, false);
} else if (state.isClosed()) {
// If the session state is closed:
// Show the login fragment
showFragment(SPLASH, false);
}
}
}
#Override
protected void onResumeFragments() {
super.onResumeFragments();
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
// if the session is already open,
// try to show the selection fragment
showFragment(SELECTION, false);
} else {
// otherwise present the splash screen
// and ask the person to login.
showFragment(SPLASH, false);
}
}
#Override
public boolean onPrepareOptionsMenu(Menu menu) {
// only add the menu when the selection fragment is showing
if (fragments[SELECTION].isVisible()) {
if (menu.size() == 0) {
settings = menu.add(R.string.settings);
}
return true;
} else {
menu.clear();
settings = null;
}
return false;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.equals(settings)) {
showFragment(SETTINGS, true);
return true;
}
return false;
}
#Override
public void onResume() {
super.onResume();
uiHelper.onResume();
isResumed = true;
}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
isResumed = false;
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
#Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
}//end of class
just remove the return from your publishstory();And make sure that your session is in OPEN state when you call publishstory().
//
if(isNetworkAvailable()){
/* ~post your data only if session is in OPEN state also check
for login and internet connection*/
Session session=Session.getActiveSession();
if(session!=null){
MyLog.w("session state",session.getState().toString());
if(session.getState()==SessionState.OPENED){
publishStory();
}else{
showAlertDialog("Unable to Share");
}
}else{
showAlertDialog("Please login first!");
}
}else{
showAlertDialog("Problem occured with your internet connection");
}
remove return statement
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
`Remove this===>` return;
}
Normally, when you got UnsupportedOperationException, it means that the device cannot find the method that used in your app.
Something you need to check:
The Android version of emulator or test device must be greater than the Min SDK?
All the library is included and exported correctly?
Related
I am developing an app where it retrieves the current user facebook friends. My Code is working on my device but when I run it on any other devices, its not displaying any results.
Could you please let me know where I am going wrong.
my code is as follows :
public class FaceBook extends Activity implements SearchView.OnQueryTextListener, SearchView.OnCloseListener{
ArrayList<Param> facebook_names = new ArrayList<Param>();
Param name = null;
Names_Adapter adapter;
ListView Names_List;
SearchView searchView;
int check_search =1;
ArrayList<Param>new_names;
private UiLifecycleHelper uiHelper;
private static final int REAUTH_ACTIVITY_CODE = 100;
#SuppressLint("NewApi")
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_face_book);
ActionBar bar = getActionBar();
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
bar.setCustomView(R.layout.custom_titlebar);
bar.setBackgroundDrawable(getResources().getDrawable(R.drawable.header));
//bar.setTitle("Main Menu");
bar.setDisplayShowHomeEnabled(true);
bar.setHomeButtonEnabled(true);
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
TextView myTitleText = (TextView) findViewById(R.id.mytext);
if ( myTitleText != null ) {
myTitleText.setText("Facebook");
}
Log.d("COMP", "TEST");
Names_List = (ListView) findViewById(R.id.listView1);
ImageButton reload = (ImageButton) findViewById(R.id.reload);
reload.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent restart = new Intent(FaceBook.this, FaceBook.class);
startActivity(restart);
finish();
}
});
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REAUTH_ACTIVITY_CODE) {
uiHelper.onActivityResult(requestCode, resultCode, data);
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.face_book, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) findViewById(R.id.searchView1);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
return true;
}
#Override
public boolean onQueryTextSubmit(String arg0) {
// TODO Auto-generated method stub
return false;
}
#Override
public boolean onQueryTextChange(String query) {
// TODO Auto-generated method stub
if(!query.isEmpty())
{
check_search = 0;
new_names = new ArrayList<Param>();
for(int i=0;i<facebook_names.size();i++)
{
if(facebook_names.get(i).getName().toLowerCase().startsWith(query))
{
Param new_param = new Param(facebook_names.get(i).getUrl(),facebook_names.get(i).getName(),facebook_names.get(i).getPic());
new_names.add(new_param);
adapter.notifyDataSetChanged();
}
}
Names_Adapter adapter = new Names_Adapter(FaceBook.this,R.layout.facebook_names_list,new_names);
Names_List.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
else
{
check_search=1;
adapter = new Names_Adapter(FaceBook.this,R.layout.facebook_names_list,facebook_names);
Names_List.setAdapter(adapter);
}
return false;
}
#Override
public boolean onClose() {
// TODO Auto-generated method stub
Names_List.setAdapter(adapter);
return false;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
int itemId = item.getItemId();
switch (itemId) {
case android.R.id.home:
FaceBook.this.finish();
break;
}
return super.onOptionsItemSelected(item);
}
private void makeRequest(Session session)
{
String fqlQuery = "SELECT uid,name,pic,profile_url FROM user WHERE uid IN " +
"(SELECT uid2 FROM friend WHERE uid1 = me()) ORDER BY first_name";
Bundle params = new Bundle();
params.putString("q", fqlQuery);
session = Session.getActiveSession();
Request request = new Request(session,
"/fql",
params,
HttpMethod.GET,
new Request.Callback(){
public void onCompleted(Response response) {
Log.i("TAG", "Result: " + response.toString());
try{
GraphObject graphObject = response.getGraphObject();
JSONObject jsonObject = graphObject.getInnerJSONObject();
Log.d("data", jsonObject.toString(0));
JSONArray array = jsonObject.getJSONArray("data");
for(int i=0;i<array.length();i++){
JSONObject friend = array.getJSONObject(i);
name = new Param(friend.optString("profile_url"),friend.optString("name"),friend.optString("pic"));
facebook_names.add(name);
// Log.d("uid",friend.getString("uid"));
// Log.d("name", friend.getString("name"));
//Log.d("pic_square",friend.getString("pic_square"));
adapter = new Names_Adapter(FaceBook.this,R.layout.facebook_names_list,facebook_names);
Names_List.setAdapter(adapter);
searchView.setOnQueryTextListener(FaceBook.this);
searchView.setOnCloseListener(FaceBook.this);
Names_List.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent(FaceBook.this,Web_Activity.class);
if(check_search==0)
{
intent.putExtra("WEB",new_names.get(arg2).getUrl());
intent.putExtra("NAME",new_names.get(arg2).getName());
}
else
{
intent.putExtra("WEB",facebook_names.get(arg2).getUrl());
intent.putExtra("NAME",facebook_names.get(arg2).getName());
}
startActivity(intent);
}
});
}
}catch(JSONException e){
e.printStackTrace();
}
}
});
Request.executeBatchAsync(request);
}
private void onSessionStateChange(final Session session, SessionState state, Exception exception) {
if (session != null && session.isOpened()) {
// Get the user's data.
makeRequest(session);
}
}
public void onResume() {
super.onResume();
Session session = Session.getActiveSession();
if (session != null &&
(session.isOpened() || session.isClosed()) ) {
onSessionStateChange(session, session.getState(), null);
}
uiHelper.onResume();
}
private Session.StatusCallback callback = new Session.StatusCallback() {
#Override
public void call(final Session session, final SessionState state, final Exception exception) {
onSessionStateChange(session, state, exception);
}
};
#Override
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
uiHelper.onSaveInstanceState(bundle);
}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
}
I also tried using restFB to access the user Facebook friends.
AccessToken accessToken = new DefaultFacebookClient().obtainAppAccessToken(appid,app secret;
FacebookClient facebookClient = new DefaultFacebookClient(accessToken.getAccessToken());
User user = facebookClient.fetchObject("me", User.class);
When I do this, it gives me an error stating that a valid access token must be used to retrieve user values.
Go to the Facebook Developer site, and under the 'Status and Review' for your app, make it PUBLIC. You can always remove from Public later after your 'temporary' testing is complete.
or
Another way would be to print out the key hashes from each device that you are testing your app on, and add these as key hashes into Settings>Android in the FB developer for your app.
There are two activity in my app to handle the 1) login 2)share image (if not login , login first then share)
The problem is when I include all code in one activity it works. But when I put the login in a fragment , the share image in another activity, then the login is work , but the share image activity behave incorrectly (Ask me to login even it is logined , and will not trigger the share image action)
Login Fragment:
public class Home extends Fragment {
public View rootView;
public ImageView HomeBg;
public ImageView buttonLoginLogout;
public TextView chi;
public TextView eng;
public ColorStateList oldColor;
public SharedPreferences prefs;
//Facebook login
private Session.StatusCallback statusCallback = new SessionStatusCallback();
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getActivity().getActionBar().hide();
rootView = inflater.inflate(R.layout.home, container, false);
buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
eng = (TextView) rootView.findViewById(R.id.btn_eng);
chi = (TextView) rootView.findViewById(R.id.btn_chi);
if (getActivity().getResources().getConfiguration().locale
.equals(Locale.TRADITIONAL_CHINESE)) {
chi.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
oldColor = eng.getTextColors();
} else {
eng.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
oldColor = chi.getTextColors();
}
eng.setOnClickListener(setChangeLangListener("en"));
chi.setOnClickListener(setChangeLangListener("zh"));
//Facebook login
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
}
if (session == null) {
session = new Session(getActivity());
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
}
}
updateView();
return rootView;
}
#Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
}
#Override
public void onStop() {
super.onStop();
Session.getActiveSession().removeCallback(statusCallback);
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
private void updateView() {
Session session = Session.getActiveSession();
if (session.isOpened()) {
buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
((LandingPage)getActivity()).tabHost.setCurrentTab(2);
}
});
} else {
buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { onClickLogin(); }
});
}
}
private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Session.openActiveSession(getActivity(), this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
#Override
public void call(Session session, SessionState state, Exception exception) {
updateView();
}
}
public OnClickListener setChangeLangListener(final String lang) {
OnClickListener changeLangListener = new OnClickListener() {
#Override
public void onClick(View arg0) {
Configuration config = new Configuration(getResources()
.getConfiguration());
if (lang.equals("en")) {
config.locale = Locale.ENGLISH;
chi.setTextColor(oldColor);
eng.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
} else {
config.locale = Locale.TRADITIONAL_CHINESE;
eng.setTextColor(oldColor);
chi.setTextColor(getActivity().getResources().getColor(
android.R.color.white));
}
getResources().updateConfiguration(config,getResources().getDisplayMetrics());
onConfigurationChanged(config);
}
};
return changeLangListener;
}
#Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Intent intent = getActivity().getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
getActivity().finish();
startActivity(intent);
}
}
Image Share Activity:
public class SharePicForm extends Activity {
private final String TAG = "SharePicForm";
public ImageView photoArea;
public ImageView sharePhotoBtn;
public EditText shareContent;
public Bitmap mBitmap;
public Context ctx;
public String shareTxt;
//Facebook share
private Session.StatusCallback statusCallback = new SessionStatusCallback();
private PendingAction pendingAction = PendingAction.NONE;
private enum PendingAction {
NONE, POST_PHOTO
}
public static boolean isShowForm = true;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.share_pic_form);
ctx = this;
Utility.setHeader(this,R.string.selfie_header,false);
photoArea = (ImageView) findViewById(R.id.photo_area);
shareContent = (EditText) findViewById(R.id.share_content);
Intent intent = getIntent();
String fileUri = (String) intent.getStringExtra("photo");
FileInputStream inputStream;
try {
File imgSelected = new File(fileUri);
if (imgSelected.exists()) {
inputStream = new FileInputStream(imgSelected);
mBitmap = Utility.decodeBitmap(inputStream, 1280, 960);
photoArea.setImageBitmap(mBitmap);
sharePhotoBtn = (ImageView) findViewById(R.id.share_submit);
sharePhotoBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if (mBitmap != null && FormValidation.hasText(shareContent)) {
try {
File imageToShare = saveBitmapToStorage();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
shareTxt = shareContent.getText().toString();
Session session = Session.getActiveSession();
if (session.isOpened()) {
Log.d(TAG,"logined");
performPublish(PendingAction.POST_PHOTO);
} else {
Log.d(TAG,"not logined");
onClickLogin();
}
//new FormSubmit(ctx).execute("shareImg",imageToShare, textToShare);
}
}
});
} else {
Utility.showDialog(ctx,"error");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private File saveBitmapToStorage () throws IOException{
String path = Environment.getExternalStorageDirectory().toString();
File outputFile = new File(path, "temp.jpg");
FileOutputStream out = new FileOutputStream(outputFile);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
return outputFile;
}
//Facebook share
private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
#Override
public void call(Session session, SessionState state, Exception exception) {
if (pendingAction != PendingAction.NONE &&
(exception instanceof FacebookOperationCanceledException ||
exception instanceof FacebookAuthorizationException)) {
new AlertDialog.Builder(ctx)
.setTitle("Cancel")
.setMessage("No grant permission")
.setPositiveButton("ok", null)
.show();
pendingAction = PendingAction.NONE;
} else if (state == SessionState.OPENED_TOKEN_UPDATED) {
handlePendingAction();
}
performPublish(PendingAction.POST_PHOTO);
}
}
private boolean hasPublishPermission() {
Session session = Session.getActiveSession();
return session != null
&& session.getPermissions().contains("publish_actions");
}
private void handlePendingAction() {
PendingAction previouslyPendingAction = pendingAction;
// These actions may re-set pendingAction if they are still pending, but we assume they will succeed.
pendingAction = PendingAction.NONE;
if (previouslyPendingAction == PendingAction.POST_PHOTO)
postPhoto();
}
private void performPublish(PendingAction action) {
Session session = Session.getActiveSession();
if (session != null) {
Log.d(TAG,"session != null");
pendingAction = action;
if (hasPublishPermission()) {
Log.d(TAG,"Has permission");
// We can do the action right away.
handlePendingAction();
return;
} else if (session.isOpened()) {
Log.d(TAG,"No permission");
// We need to get new permissions, then complete the action when we get called back.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, "publish_actions"));
return;
}
Log.d(TAG,"Session not open");
}
Log.d(TAG,"Session null");
}
private void postPhoto() {
Log.d(TAG,"postPhoto: " + hasPublishPermission());
if (hasPublishPermission()) {
if (mBitmap != null) {
Request request = Request.newUploadPhotoRequest(
Session.getActiveSession(),mBitmap, new Request.Callback() {
#Override
public void onCompleted(Response response) {
showPublishResult(response.getError());
}
});
Bundle params = request.getParameters();
if (shareTxt != null)
params.putString("message", shareTxt);
request.setParameters(params);
request.executeAsync();
}
} else {
pendingAction = PendingAction.POST_PHOTO;
}
}
private void showPublishResult(FacebookRequestError error) {
if (error == null) {
Utility.showDialog(ctx,"success_photo");
} else {
Utility.showDialog(ctx,"error");
}
}
}
Thanks for helping. Any help is appreciate thanks.
Log for the share image activity
02-11 02:18:17.914: D/SharePicForm(21646): logined
02-11 02:18:17.914: D/SharePicForm(21646): session != null
02-11 02:18:17.914: D/SharePicForm(21646): No permission
You are missing the 'UiLifecycleHelper's' implementation in your Fragment:
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
#Override
public void call(Session session, SessionState state, Exception exception) {
//Do what ever you want to do here
}
};
onCreate(....)
{
uiHelper = new UiLifecycleHelper(VideoShareActivity.this, callback);
uiHelper.onCreate(savedInstanceState);
}
#Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
uiHelper.onPause();
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
Now your Session.getActiveSession() should not return null.
I hope this helps.
I need to ask at the user to authorize publish permission if he dont do it.
I do it with this row of code:
//Into ShareOnFacebookFragment
Session.getActiveSession().requestNewPublishPermissions(new NewPermissionsRequest((SocialSharingActivity)getActivity(), "publish_actions"));
SocialSharingActivity is the Activity related to my Fragment (ShareOnFacebookFragment).
When I run the application the app correctly ask me the publish permission and I accept, but when I do publish I have this error in my logcat:
12-11 12:17:27.277: E/AndroidRuntime(29125): Caused by: java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request.
Honestly my only hypotesis is that requestNewPublishPermissions run Async in background and then I have the problems when I try to publish. How I can solve this problem ? I post also my Entire fragment code
private final String TAG = "ShareFragment";
private UiLifecycleHelper uiHelper;
// To allow a Fragment to communicate up to its Activity, you can define an interface in the Fragment class and implement it within the
// Activity. The Fragment captures the interface implementation during its onAttach() lifecycle method and can then call the Interface methods in
// order to communicate with the Activity.
private Session.StatusCallback callback = new Session.StatusCallback() { //Provides asynchronous notification of Session state changes.
#Override
public void call(Session session, SessionState state,Exception exception) {
onSessionStateChange(session, state, exception);
}
};
private void onSessionStateChange(Session session, SessionState state,Exception exception) {
Log.i("CALLBACK: ", "Session state change: "+state);
}
#Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
};
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
// try {
// mCallback = (OnHeadlineSelectedListener) activity;
// } catch (ClassCastException e) {
// throw new ClassCastException(activity.toString()
// + " must implement OnHeadlineSelectedListener");
// }
//}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
};
#Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
uiHelper.onResume();
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
RelativeLayout myRelative = (RelativeLayout) inflater.inflate(R.layout.share_frame, container, false);
shareButton = (Button) myRelative.findViewById(R.id.shareButton);
workoutIdTextView = (TextView) myRelative.findViewById(R.id.workoutIdTextView);
objectCreatedTextView = (TextView) myRelative.findViewById(R.id.objectCreatedTextView);
actionCreatedTextView = (TextView) myRelative.findViewById(R.id.actionCreatedTextView);
return myRelative;
}
#Override
public void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
#Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
uiHelper.onDestroy();
}
#Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
#Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
Log.i(TAG, "ONACTIVITYCREATED");
SocialSharingActivity caller =(SocialSharingActivity) getActivity();
Log.w(TAG, "caller "+caller.toString());
workoutIdTextView.setText(String.valueOf(caller.getWorkoutId()));
Log.i(TAG, "Data course " + caller.getEwCourse().toString());
Log.i(TAG, "Message Run " + caller.getEwRun().toString());
ewCourseFrag = caller.getEwCourse();
ewRunFrag = caller.getEwRun();
parAct=new Bundle();
parAct.putAll(ewRunFrag.getParams());
parObj = new Bundle();
parObj.putString("access_token", APP_ACCESS_TOKEN);
gson = new Gson();
parObj.putString("object", gson.toJson(ewCourseFrag));
publishSession = Session.getActiveSession();
//------------------------------Batch HTTP request-----------------------------------------------------------------------------------------------------------------
//
//------------------------------Declaration--and--implementation--of--Callback-----------------------------------------------------------------------------------------------------------------
RequestBatch.Callback batchCallback= new RequestBatch.Callback() {
#Override
public void onBatchCompleted(RequestBatch batch) {
Log.w(TAG, "Batch completed: "+ "OK");
//
}
};
//
Request.Callback reqCreateObjCallback= new Request.Callback() {
#Override
public void onCompleted(Response response) {
if(response.getError() == null){
Log.w(TAG,"reqCreateObjCallback: "+ "OK");
objectCreatedTextView.setText("OK object");
}
else {
Log.e(TAG,"reqCreateObjCallback: "+ response.getError().toString());
Log.d(TAG, response.getError().getCategory().toString());
objectCreatedTextView.setText(response.getError().getCategory().toString());
}
//400
}
};
//
Request.Callback reqPublishCallback= new Request.Callback() {
#Override
public void onCompleted(Response response) {
if(response.getError() == null) {
Log.w(TAG, "reqPublishCallback: "+ "OK");
actionCreatedTextView.setText("OK action");
// Toast.makeText(context, "ACTION_CREATED", Toast.LENGTH_LONG).show();
}
else {
Log.e(TAG, "reqPublishCallback: "+ response.getError().toString());
Log.d(TAG, response.getError().getCategory().toString());
actionCreatedTextView.setText(response.getError().getCategory().toString());
}
}
};
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------Create--instance--of--RequestBatch--------------------------------------------------------------------------------------------------------
RequestBatch requestBatch= new RequestBatch();
//------------------------------Request--for-create-the-graph-object---------------------------------------------------------------------------------------------------------------
Request reqCreateObj= new Request(
publishSession,
"app/objects/fitness.course",
parObj,HttpMethod.POST); //Create a Request for a common ObiectGraph of type course
reqCreateObj.setCallback(reqCreateObjCallback); //Set the callback for the Request
reqCreateObj.setBatchEntryName("objectCreate"); //Tag the request name into the Batch with "objectCreate"
requestBatch.add(reqCreateObj); //Add the request to the batch
//------------------------------Request-for-publish-action-------------------------------------------------------------------------------------------------------------------------------
parAct.putString("course",
"{result=objectCreate:$.id}"); //Use the tag to retrieve the informations about the graph object created
//can also add scrape flag to update the object
// par2.putString("end_time", new Date(new Date().getTime()+1000*60*2).toString()); // live text test
Request reqPublish =
new Request(publishSession, //Create a request for publish an action relative to the object;
// Similarly at a phrase, an action is like "verbo", graph object
"me/fitness.runs/",parAct, //is like "complemento oggetto" and the the user is "soggetto"
HttpMethod.POST); //
reqPublish.setCallback(reqPublishCallback); //Set the callback for the Request
requestBatch.add(reqPublish); //Add the request to the batch
requestBatch.addCallback(batchCallback); //Set the callback for the Batch Request
//Check network session opened and permissions
//codice sospeso
if(Session.getActiveSession().isOpened() && hasPublishPermission() && isNetworkAvailable()) {
Toast.makeText(getActivity(), "Session is opened, I have permission, Network is On", Toast.LENGTH_LONG).show();
requestBatch.executeAsync();
}
else if (Session.getActiveSession().isOpened() && isNetworkAvailable()){
Toast.makeText(getActivity(), "I dont have Permissions: " + Session.getActiveSession().getPermissions(), Toast.LENGTH_LONG).show();
Session.getActiveSession().requestNewPublishPermissions(new NewPermissionsRequest((SocialSharingActivity)getActivity(), "publish_actions"));
Toast.makeText(getActivity(), "Permissions: " + Session.getActiveSession().getPermissions(), Toast.LENGTH_LONG).show();
}
else if (Session.getActiveSession().isOpened() && hasPublishPermission()) {
Toast.makeText(getActivity(), "Check your status connection.", Toast.LENGTH_LONG).show();
}
else {
Intent loginIntent = new Intent((SocialSharingActivity)getActivity(),FbLoginActivity.class);
startActivity(loginIntent);
}
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
private boolean hasPublishPermission() {
Session session = Session.getActiveSession();
return session != null && session.getPermissions().contains("publish_actions");
}
}
I am using Facebook in my android app and it work just fine.
However, i realize that useless screen appears when i login every time saying that "you have already-authorized to this app" with OK and Cancel option.
How can i avoid or remove this screen from my app.
I searched on Google and i found some answer for older Facebook SDK But how to achieve it with new Facebook SDK(3.0 and above)?
this is my code,
public void onClick(View v)
{
Bundle myParams = new Bundle();
myParams.putString("message", " DOWNLOAD THE 'Saragama' ANDROID APP FROM " + url_android.toString()
+ ". Fully integrated with Facebook and Twitter.");
myParams.putString("name", mSharingText.getText().toString());
myParams.putString("caption", "www.saragama.com");
myParams.putString("description", "Various religios music, chants, mantras, christian songs, islamic music, quran and more on saragama");
myParams.putString("link", "http://android.saragama.com");
myParams.putString("picture", albumImageURL);
if (PlusUtilities.isInternetConnected())
{
// ~post your data
Session session = Session.getActiveSession();
if (session != null)
{
MyLog.w("session state", session.getState().toString());
if (session.getState().equals(SessionState.OPENED) || session.getState().equals(SessionState.OPENED_TOKEN_UPDATED))
{
publishStory(myParams);
}
else
{
plusUtilities1.showAlertDialog("Please login first!");
}
}
else
{
plusUtilities1.showAlertDialog("Please login first!");
}
}
else
{
plusUtilities1.showAlertDialog("Problem occured with your internet connection!");
}
}
// Facebook Login-------------------------------------------------------------------------------------
private void loginToFacebook()
{
if (PlusUtilities.isInternetConnected())
{
Session session = Session.getActiveSession();
// if session is in exceptional state
if (session.getState() == SessionState.CLOSED_LOGIN_FAILED || session.getState() == SessionState.OPENING)
{
session.closeAndClearTokenInformation();
}
if (!session.isOpened() && !session.isClosed())
{
String[] PERMISSION_ARRAY_PUBLISH =
{"publish_actions" };
List<String> PERMISSION_LIST = Arrays.asList(PERMISSION_ARRAY_PUBLISH);
session.openForPublish(new Session.OpenRequest(FacebookActivity.this).setPermissions(PERMISSION_LIST).setCallback(
statusCallback1));
}
else
{
Session.openActiveSession(this, true, statusCallback1);
}
}
else
{
plusUtilities1.showAlertDialog("Please check your internet connection!");
}
}
#Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
#Override
protected void onActivityResult(int requestCode, int responseCode, Intent data)
{
super.onActivityResult(requestCode, responseCode, data);
// plusUtilities1.ShowToast("onActivityResult");
MyLog.i("onActivityResult requestCode :responsecode:session state", requestCode + ":" + responseCode + ":"
+ Session.getActiveSession().getState().toString());
switch (requestCode)
{
case MyRaagaLoginActivity.REQUEST_CODE_FACEBOOK_LOGIN:
if (responseCode == RESULT_OK)
{
MyLog.e("Login", "trying to facebook Login");
Session.getActiveSession().onActivityResult(Act1, requestCode, responseCode, data);
}
else
{
plusUtilities1.ShowToast("User access denied!");
}
break;
default:
MyLog.i("case:", "default");
break;
}
}
/**
* function to get active facebook session if already exist or create the new session
*
* #param savedInstanceState
* =check if Session exist and restored in bundle during onSaveInstanceState() system call
* #author DeepakD
*/
public void GetOrCreateFacebookActiveSession(Bundle savedInstanceState)
{
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Settings.addLoggingBehavior(LoggingBehavior.REQUESTS);
Session session = Session.getActiveSession();
// if session is null try to find if session is saved previously
if (session == null)
{
if (savedInstanceState != null)
{
session = Session.restoreSession(this, null, statusCallback1, savedInstanceState);
}
// if still session is null then create the new session
if (session == null)
{
session = new Session(this);
}
// set the created session as active session
Session.setActiveSession(session);
}
updateFBbutton();
}
/**
* set login or logout button
*/
private void updateFBbutton()
{
Session session = Session.getActiveSession();
if (session.isOpened())
{
FbLoginbtn.setText("FBLogout");
FbLoginbtn.setOnClickListener(new OnClickListener()
{
public void onClick(View view)
{
onClickFBLogout();
}
});
}
else
{
FbLoginbtn.setText("FBLogin");
FbLoginbtn.setOnClickListener(new OnClickListener()
{
public void onClick(View view)
{
loginToFacebook();
}
});
}
}
/**
* Logout from facebook
*/
private void onClickFBLogout()
{
Session session = Session.getActiveSession();
if (!session.isClosed())
{
session.closeAndClearTokenInformation();
plusUtilities1.ShowToast("Logout successful");
}
}
/**
* This class is used to fetch the current status of active session
*
* #author DeepakD
*
*/
private class SessionStatusCallback1 implements Session.StatusCallback
{
#Override
public void call(Session session, SessionState state, Exception exception)
{
updateFBbutton();
plusUtilities1.DissmissPD();
MyLog.w("session state", session.getState().toString());
if(session.getState()==SessionState.CLOSED_LOGIN_FAILED)
{
//login failed
plusUtilities1.ShowToast("Unable to connect,please try later..");
session.closeAndClearTokenInformation();
}
if (session.getState()== SessionState.OPENED)
{
//login successful
plusUtilities1.ShowToast("Login successful");
}
}
}
/**
* actually post the data on facebook
*
* #param myParams
* Bundle of parameters to be post
*/
private void publishStory(Bundle myParams)
{
plusUtilities1.ShowPD("Sharing data...");
Session session = Session.getActiveSession();
if (session != null)
{
// Check for publish permissions
List<String> permissions = session.getPermissions();
try
{
if (!isSubsetOf(PERMISSIONS, permissions))
{
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
}
}
catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
Request.Callback callback = new Request.Callback()
{
public void onCompleted(Response response)
{
plusUtilities1.DissmissPD();
MyLog.w("post response", "" + response.toString());
if (response.getError() == null)
{
JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
String postId = null;
try
{
postId = graphResponse.getString("id");
}
catch (JSONException e)
{
Toast.makeText(FacebookActivity.this, "JSON error " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
catch (Exception e)
{
e.printStackTrace();
Toast.makeText(FacebookActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
FacebookRequestError error = response.getError();
Log.e("post response", response.toString());
if (error != null)
{
Toast.makeText(FacebookActivity.this, error.getErrorMessage(), Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(FacebookActivity.this, "Posted successfully!",
Toast.LENGTH_LONG).show();
FlurryAgent.logEvent("Audio Facebook share -" + EventName);
}
}
else
{
plusUtilities1.showAlertDialog("Something went wrong while posting!");
}
}
};
MyLog.w("BUNDLE TO BE POSTED;", myParams.toString());
Request request = new Request(session, "/me/feed", myParams, HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
}
}
public static boolean isSubsetOf(Collection<String> subset, Collection<String> superset)
{
for (String string : subset)
{
if (!superset.contains(string))
{
return false;
}
}
return true;
}
protected void onStart()
{
super.onStart();
MyLog.i("FacebookActivity", "onStart");
FlurryAgent.onStartSession(this, KeysCls.Flurry_Analytics_Key);
FlurryAds.displayAd(this, "AppCircle_Ads", linlayAdLayout);
if (PlusUtilities.isInternetConnected())
{
Session.getActiveSession().addCallback(statusCallback1);
}
else
{
plusUtilities1.showAlertDialog("Please check your internet connection and try again!");
}
}
/**
* convert post's simple text to text with links
*
* #param Name
* #param Link
* #return
*/
String wallpostWithLink(String Name, String Link)
{
jo = new JSONObject();
try
{
jo.put("name", Name);
jo.put("link", Link);
}
catch (Exception e)
{
e.printStackTrace();
}
return jo.toString();
}
#Override
protected void onStop()
{
super.onStop();
FlurryAgent.onEndSession(this);
}
Go to developers.facebook.com and in Settings-> Basic->Single Sign On -> YES
In facebook sdk 4.0 try to activate and deactivate app in onResume and onPause like this:
#Override
protected void onResume() {
super.onResume();
// update your UI
// Logs 'install' and 'app activate' App Events.
AppEventsLogger.activateApp(this);
}
#Override
protected void onPause() {
super.onPause();
// Logs 'app deactivate' App Event.
AppEventsLogger.deactivateApp(this);
}
when I install my app via ADB via Eclipse, then the facebook logon as well as publishing to the wall of the user works (using facebook SDK 3.0), but when I package my app and then install that app, then the facebook logon does not work. I get the fragment with a logon button, when I push the logon button, then it shows the dialog that the app wants to have access to my public profile and friendlist. When I click ok it goes back to the fragment with the login button.
My question is: What should I change to make the facebook SDK integration work during deployment time as well?
my code of the fragment (erased non-relevant parts):
public class Fragment_shareFacebook extends SherlockFragment {
Context context; //context and fields:
View v;
private Button shareButton;
private MainActvityCommunicatorIntentBasedLeaveManagement intentleaveset;
private EditText toshareText;
private TextView textInstructionsOrLink, sharedText, fb_share_title_preview, fb_share_text_preview, sharesubsubtitle;
private ViewSwitcher switcher;
private LinearLayout fb_preview_keeper, mainlayoutholderfbshare, loggedinscreen;
String subject, content;
private boolean switched;
private UiLifecycleHelper uiHelper;
private static final int REAUTH_ACTIVITY_CODE = 100;
private UserSettingsFragment usersetting;
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private Session.StatusCallback callback =
new Session.StatusCallback() {
#Override
public void call(Session session,
SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
/**
* empty constructor
*/
public Fragment_shareFacebook(){
}
#Override
/**
* initialize the intentleaveset to inform main that we have an intent based leave standing by
*/
public void onAttach(Activity activity) {
super.onAttach(activity);
context = getActivity();
intentleaveset=(MainActvityCommunicatorIntentBasedLeaveManagement) context;
}
#Override
/**
* get the content that needs to be shared, also retrieve the pendingPublishReauthorization if necessary
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setHasOptionsMenu(true);
uiHelper = new UiLifecycleHelper(this.getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
subject = getArguments().getString("subject");
content = getArguments().getString("text");
}
#Override
public void onResume() {
super.onResume();
uiHelper.onResume();
Session session = Session.getActiveSession();
this.onSessionStateChange(session, session.getState(), null);
}
#Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
#Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==REAUTH_ACTIVITY_CODE){
uiHelper.onActivityResult(requestCode, resultCode, data);
}
}
#Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
#Override
public void onDestroyView(){
//note: we have to remove the fragment again!
try{
FragmentTransaction transaction = this.getActivity().getSupportFragmentManager().beginTransaction();
transaction.remove(usersetting);
transaction.commit();
}catch(Exception e){
}
super.onDestroyView();
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
//hvg: dze even disecten.
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.fragment_facebook_share, container, false);
textInstructionsOrLink = (TextView) v.findViewById(R.id.textInstructionsOrLink);
fb_share_title_preview= (TextView) v.findViewById(R.id.fbsharetitlepreview);
fb_share_text_preview= (TextView) v.findViewById(R.id.fbsharetextpreview);
sharesubsubtitle=(TextView) v.findViewById(R.id.sharesubsubtitle);
loggedinscreen=(LinearLayout) v.findViewById(R.id.loggedinscreen);
usersetting=(UserSettingsFragment) this.getActivity().getSupportFragmentManager().findFragmentById(R.id.userSettingsFragment);
//authButton = (LoginButton) v.findViewById(R.id.authButton);
shareButton = (Button) v.findViewById(R.id.shareButton);
//usernamefield= (TextView) v.findViewById(R.id.selection_user_name);
toshareText = (EditText) v.findViewById(R.id.toshareText);
fb_preview_keeper= (LinearLayout) v.findViewById(R.id.fb_preview_keeper);
mainlayoutholderfbshare = (LinearLayout) v.findViewById(R.id.mainlayoutholderfbshare);
switcher=(ViewSwitcher)v.findViewById(R.id.fb_switcher);
mainlayoutholderfbshare.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(toshareText.isFocused()){
Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--");
if (toshareText.isFocused()) {
Rect outRect = new Rect();
toshareText.getGlobalVisibleRect(outRect);
if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
toshareText.clearFocus();
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
Log.i("X-Y coordinate", "--" + event.getX() + " : " + event.getY() + "--");
//Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
return false;
}
});
//toshareText.setText(content);
switcher=(ViewSwitcher) v.findViewById(R.id.fb_switcher);
sharedText=(TextView) v.findViewById(R.id.sharedText);
if(switcher.getDisplayedChild()==0){
switched=false;
}else{
switched=true;
}
//note that we need a custom onclicklistener to share the story to fb
shareButton.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View v) {
intentleaveset.setIntentleave(true);
publishStory();
}
});
//note to main: we are leaving with an intent!
intentleaveset.setIntentleave(true);
Log.d("fsf: leaveintent","settrue");
Session session = Session.getActiveSession();
SessionState state = Session.getActiveSession().getState();
onSessionStateChange(session, state, null);
return v;
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
// Only make changes if the activity is visible
intentleaveset.setIntentleave(true);
Log.d("switcher-init", Integer.toString(switcher.getDisplayedChild()));
if (state.isOpened()) {
// If the session state is open:
// Show the authenticated fragment
shareButton.setVisibility(View.VISIBLE);
toshareText.setVisibility(View.VISIBLE);
fb_preview_keeper.setVisibility(View.VISIBLE);
LayoutParams params = fb_preview_keeper.getLayoutParams();
params.height=LayoutParams.WRAP_CONTENT;
params.width=LayoutParams.MATCH_PARENT;
fb_preview_keeper.setLayoutParams(params);
params=shareButton.getLayoutParams();
params.height=LayoutParams.WRAP_CONTENT;
params.width=LayoutParams.MATCH_PARENT;
shareButton.setLayoutParams(params);
params=toshareText.getLayoutParams();
params.width=LayoutParams.MATCH_PARENT;
params.height=LayoutParams.WRAP_CONTENT;
toshareText.setLayoutParams(params);
toshareText.setMinLines(3);
toshareText.setScroller(new Scroller(context));
toshareText.setVerticalScrollBarEnabled(true);
fb_share_title_preview.setText(subject);
fb_share_text_preview.setText(getString(R.string.facebook_share_subtitle).concat("\n \n").concat(content));
if(!switched){
textInstructionsOrLink.setText(getString(R.string.facebookexplanationafterlgoong));
}else{
textInstructionsOrLink.setText(getString(R.string.facebookexplanationaftershared));
if(switcher.getDisplayedChild()!=1){
switcher.showNext();
}
/*
if(switcher.getDisplayedChild()==1){
switcher.showPrevious();
}else{
switcher.showNext();
}
*/
}
params=loggedinscreen.getLayoutParams();
params.height=LayoutParams.WRAP_CONTENT;
loggedinscreen.setLayoutParams(params);
sharesubsubtitle.setFocusable(true);
sharesubsubtitle.requestFocus();
} else {
// If the session state is closed:
// Show the login fragment
if(switcher.getDisplayedChild()==1){
switcher.showPrevious();
}
switched=false;
shareButton.setVisibility(View.INVISIBLE);
//shareButton.setHeight(0);
toshareText.setVisibility(View.INVISIBLE);
//toshareText.setHeight(0);
//LayoutParams params = switcher.getLayoutParams();
//params.height=0;
//params.width=params.MATCH_PARENT;
//switcher.setLayoutParams(params);
//fb_preview_keeper.setVisibility(View.INVISIBLE);
//params = fb_preview_keeper.getLayoutParams();
//params.height=0;
//params.width=params.MATCH_PARENT;
//fb_preview_keeper.setLayoutParams(params);
LayoutParams params=loggedinscreen.getLayoutParams();
params.height=0;
loggedinscreen.setLayoutParams(params);
sharedText.setText("");
textInstructionsOrLink.setText(this.getResources().getString(R.string.facebookexplainbeforelogon));
}
}
private void publishStory() {
Session session = Session.getActiveSession();
if (session != null){
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS)
.setRequestCode(REAUTH_ACTIVITY_CODE);
session.requestNewPublishPermissions(newPermissionsRequest);
//session.reauthorizeForPublish(newPermissionsRequest);
return;
}
Bundle postParams = new Bundle();
postParams.putString("name", subject);
postParams.putString("caption", getString(R.string.facebook_share_subtitle));
postParams.putString("description", content);
if(toshareText.getText()!=null){
postParams.putString("message", toshareText.getText().toString());
}else{
postParams.putString("message", " ");
}
postParams.putString("link", "http://www.thewonderweeks.com");
postParams.putString("picture", "www.thewonderweeks.com/apple-touch-icon-114x114.png");
Request.Callback callback= new Request.Callback() {
public void onCompleted(Response response) {
JSONObject graphResponse;
try{
graphResponse = response
.getGraphObject()
.getInnerJSONObject();
}catch (Exception e){
if(e.getMessage()!=null){
Log.d("errorinFBcallback", e.getMessage());
}
return ;
}
String postId = null;
try {
postId = graphResponse.getString("id");
} catch (JSONException e) {
Log.i("errormessagefacebookfragmenthtingy",
"JSON error "+ e.getMessage());
}
FacebookRequestError error = response.getError();
if (error != null) {
Toast.makeText(getActivity()
.getApplicationContext(),
error.getErrorMessage(),
Toast.LENGTH_SHORT).show();
} else {
Log.d("post id of posted material", postId);
shareButton.setVisibility(View.INVISIBLE);
if(switcher.getDisplayedChild()!=1){
switcher.showNext();
}
switched=true;
sharedText.setText(getString(R.string.successhare).concat(" ").concat(toshareText.getText().toString()));
textInstructionsOrLink.setText(getString(R.string.facebookexplanationaftershared));
}
}
};
Request request = new Request(session, "me/feed", postParams,
HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
}
}
I assume you followed the facebook developers tutorial. If so, you use this command to produce your key
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
You must also create a key with release keystore and register it to facebook.