2014-11-22 130 views
0

我想整合谷歌加登錄來獲取用戶的詳細信息,如姓名,電子郵件和他的個人資料圖片。發送圖像從一個活動到另一個失敗

現在使用下面的代碼,我想,如果我用它在同一個活動,我讓他的個人檔案相片太

Login.Java

得到他的姓名,電子郵件和個人檔案相片
public void onConnected(Bundle connectionHint) { 

    // We've resolved any connection errors. mGoogleApiClient can be used to 
    // access Google APIs on behalf of the user. 
    // Get user's information 
    getProfileInformation(); 
} 

private void getProfileInformation() { 

    if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { 

     Intent i = new Intent(getApplicationContext(), MainActivity.class); 
     Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); 
     String personPhotoUrl = currentPerson.getImage().getUrl(); 
     String personGooglePlusProfile = currentPerson.getUrl(); 
     Toast.makeText(this, personPhotoUrl, Toast.LENGTH_LONG).show(); 
     String email = Plus.AccountApi.getAccountName(mGoogleApiClient); 
     //new GetProfileImage(urImageView).execute(personPhotoUrl); 
     // Create the bundle 
     new GetProfileImage().execute(personPhotoUrl); 
     Bundle bundle = new Bundle(); 
     // Add your data from getFactualResults method to bundle 
     bundle.putString("Google", "Logged in using Google Account"); 
     bundle.putString("GoogleUsername", currentPerson.getDisplayName()); 
     bundle.putString("GoogleEmail", email); 
     if(resultBmp!=null) { 

      i.putExtra("GoogleProfileImage", resultBmp); 
     } 
     i.putExtras(bundle); 
     startActivity(i); 
    } 

    private class GetProfileImage extends AsyncTask<String, Void, Bitmap> { 

     protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 

      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 

     } catch (Exception e) { 

      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 

     resultBmp = result; 
     //bmImage.setImageBitmap(result); 
    } 
} 

MainActivity.Java

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(Plus.API, PlusOptions.builder().build()) 
     .addScope(Plus.SCOPE_PLUS_LOGIN) 
     .build(); 

    mGoogleApiClient.connect(); 
    Intent intent = getIntent(); 
    if(intent.getStringExtra("Google") != null){ 

     // 1. get passed intent 
     // 2. get message value from intent 
     String userName = intent.getStringExtra("GoogleUsername"); 
     String email = intent.getStringExtra("GoogleEmail"); 
     if(intent.getStringExtra("Google").equals("Logged in using Google Account")){ 

      ((TextView)findViewById(R.id.txtUser)).setText(userName); 
      ((TextView)findViewById(R.id.txtemail)).setText(email); 

      Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("GoogleProfileImage"); 
      //Bitmap bitmap = getIntent().getParcelableExtra("GooglePic"); 
      ImageView imageView = (ImageView) findViewById(R.id.imgProfilePic); 
      imageView.setImageBitmap(bitmap); 
     } 
    } 
} 

protected void onStart() { 

    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

protected void onStop() { 

    super.onStop(); 
    if (mGoogleApiClient.isConnected()) { 

     mGoogleApiClient.disconnect(); 
    } 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 

    // TODO Auto-generated method stub 
    Log.d("Debug","Connection failed"); 
    Intent i = new Intent(this,Login.class); 
    startActivity(i); 
    finish(); 
    //super.onConnectionFailed(result); 
} 

@Override 
public void onConnected(Bundle connectionHint) { 

    // TODO Auto-generated method stub 
    Log.d("Debug","Connected"); 
    //super.onConnected(connectionHint); 
    mGoogleApiClient.connect(); 
} 

如果我嘗試這個圖像發送到n ext activity it dosent在第一次登錄時向我顯示圖片。如果我第二次登錄,或者我恢復應用程序,它會顯示圖片。

任何人都可以說我在哪裏我的MainActivity錯了嗎?

+0

我認爲更好的方法是通過ImageView路徑並從MainActivity路徑中獲取圖像,傳遞圖像bitamp需要大量內存。 – 2014-11-22 11:29:26

+0

是否有任何理由通過圖像位圖,而不是路徑? – 2014-11-22 11:32:00

+0

沒有什麼這樣的。我只是在用戶登錄後才顯示用戶的個人資料照片,就像使用導航抽屜的gmail和youtube一樣。 – coder 2014-11-22 11:34:54

回答

0

嘗試這樣的方式,

將其轉換爲一個字節數組,你將它添加到以前的意圖,把它發送出去,和解碼。

//轉換爲字節數組

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

Intent in1 = new Intent(this, Activity2.class); 
in1.putExtra("image",byteArray); 

然後在活動2:

byte[] byteArray = getIntent().getByteArrayExtra("image"); 
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
+0

創建字節數組ia不是一個正確的解決方案,因爲從圖像創建字節需要一定的時間,這可能導致延遲顯示下一個屏幕。通過Intent傳遞對象時,可以使用parcelable接口。請閱讀更多關於parcelable from developer.android.com – 2014-11-22 11:30:18

+0

@ Moradiya-感謝您的幫助。即使我試過這種方式,但沒有工作 – coder 2014-11-22 11:40:50

0

讓你的位圖引用靜態爲靜態變量可以從另一個活動進行訪問。

0

我的事情你的問題是:

加載時第一次活動開始的形象還不加載圖像需要時間,因此,這是這樣你看到的圖像僅在第二次時,已經加載。

嘗試使用asyncTask或任何其他後臺進程來加載圖像。

如果您使用普通線程,請在設置要查看的圖像時不要忘記調用「runOnUIthread」。 如果您已經使用後臺進程加載圖像,則在進程完成時設置回調來調用。

相關問題