會議

2014-02-10 34 views
0

有我的應用程序來處理1)登錄2)共享圖像(如果無法登錄,登錄第一則份額)兩大活動會議

問題是,當我包括所有的代碼在一項活動中起作用。但是當我把登錄放在一個片段中時,共享圖像在另一個活動中,那麼登錄是可行的,但共享圖像活動的行爲不正確(即使它被登錄也要求我登錄,並且不會觸發共享圖像操作)

登錄片段:

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

} 

圖片分享活動:

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

} 

感謝您的幫助。任何幫助表示感謝。

登錄的共享圖像的活動

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 
+0

看起來你的應用程序運行正常,第二個「登錄」請求是當你要求額外的權限(發佈權限)時。這將是預期的行爲。 –

回答

0

你缺少你的片段 'UiLifecycleHelper的' 執行:

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

現在你Session.getActiveSession()不應返回null。
我希望這有助於。