2017-02-10 8 views
0

ありがとうございます。私はMyAccountActivityで作業していたところで、ユーザーは自分のプロフィール画像を変更することができます。私がここでやっていることは、切り抜きイメージがonActivityResult()メソッドで実行されると、プログラムは現在のユーザーのイメージ値を変更するということです。イメージ値が変更されると、onValueEventListenerをonCreate()メソッドで再度呼び出して、その値を読み込み、addValueEventListenerで行ったようにそのイメージのURLまたは文字列をPicassoに格納します。しかし、アプリケーションはトリミング後自動的に私にサインします。Android Firebase - 子データの変更後に自動的にログアウトしました

mImageUrlを印刷すると、画像が正常に切り取られたときに値が変更されたことがわかりましたが、2番目の後に前の画像に戻ってきてからログアウトしました。

誰でも私にこれを助けることができますか?ありがとうございました。

MyProfileActivity.java Firebaseリアルタイムデータベースのための

public class MyProfileActivity extends AppCompatActivity 
{ 
    /*UI*/ 
    private Toolbar mMyProfileToolbar; 
    private TextView mAge; 
    private TextView mGender; 
    private TextView mReligion; 
    private TextView mSports; 
    private TextView mState; 
    private TextView mTimeRegistered; 
    private TextView mDisplayName; 
    private CircleImageView mProfileImage; 

    /*Firebase*/ 
    private DatabaseReference mDatabaseUser; 
    private FirebaseUser mUser; 
    private StorageReference mStorage; 
    private DatabaseReference mDatabasePost; 
    private StorageReference filepath; 
    private DatabaseReference user_db; 

    /*Other*/ 
    private String age; 
    private String gender; 
    private String religion; 
    private String sports; 
    private String state; 
    private String timeRegistered; 
    private String displayName; 

    private Uri mImageUri = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my_profile); 

     /*UI*/ 
     mMyProfileToolbar = (Toolbar)findViewById(R.id.activity_my_profile_toolbar); 
     mProfileImage = (CircleImageView)findViewById(R.id.activity_my_profile_profile_image); 
     mDisplayName = (TextView)findViewById(R.id.activity_my_profile_display_name); 
     mAge = (TextView)findViewById(R.id.activity_my_profile_age); 
     mGender = (TextView)findViewById(R.id.activity_my_profile_gender); 
     mReligion = (TextView)findViewById(R.id.activity_my_profile_religion); 
     mSports = (TextView)findViewById(R.id.activity_my_profile_sports); 
     mState = (TextView)findViewById(R.id.activity_my_profile_state); 
     mTimeRegistered = (TextView)findViewById(R.id.activity_my_profile_time_registered); 

     /*Firebase*/ 
     mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("User"); 
     mUser = FirebaseAuth.getInstance().getCurrentUser(); 
     mStorage = FirebaseStorage.getInstance().getReference(); 

     /*Function*/ 
     setSupportActionBar(mMyProfileToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setTitle(null); 


     mDatabaseUser.child(mUser.getUid()).addValueEventListener(new ValueEventListener() 
     { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) 
      { 
       System.out.println("TestUp------------------------------------at addValueEventListener"); 
       displayName = dataSnapshot.child("displayName").getValue().toString(); 
       age = dataSnapshot.child("age").getValue().toString(); 
       gender = dataSnapshot.child("gender").getValue().toString(); 
       religion = dataSnapshot.child("religion").getValue().toString(); 
       sports = dataSnapshot.child("sports").getValue().toString(); 
       state = dataSnapshot.child("state").getValue().toString(); 
       timeRegistered = dataSnapshot.child("timeRegistered").getValue().toString(); 

       mImageUri = Uri.parse(dataSnapshot.child("image").getValue().toString()); 
       System.out.println("TestUp------------------------------------mImageUri: " + mImageUri); 

       Picasso.with(MyProfileActivity.this).load(mImageUri).into(mProfileImage); 


       mDisplayName.setText(displayName); 
       mAge.setText("Age: " + age); 
       mGender.setText("Gender: " + gender); 
       mReligion.setText("Religion: " + religion); 
       mSports.setText("Sports: " + sports); 
       mState.setText("State: " + state); 
       mTimeRegistered.setText("Time Registered: " + timeRegistered); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) 
      { 

      } 
     }); 

     mProfileImage.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.setType("image/*"); 
       startActivityForResult(i, 1); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(requestCode == 1 && resultCode == RESULT_OK) 
     { 
      mImageUri = data.getData(); 

      CropImage.activity(mImageUri) 
        .setGuidelines(CropImageView.Guidelines.OFF) 
        .setAspectRatio(1, 1) 
        .start(this); 
     } 
     if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) 
     { 
      CropImage.ActivityResult result = CropImage.getActivityResult(data); 

      if(resultCode == RESULT_OK) 
      { 
       mImageUri = result.getUri(); 

       DatabaseReference user_db = mDatabaseUser.child(mUser.getUid()); 
       user_db.child("image").setValue(mImageUri.toString()); 

       System.out.println("TestDown------------------------------------user_db: " + user_db); 
       System.out.println("TestDown------------------------------------mImageUri: " + mImageUri); 


      } 
      else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) 
      { 
       System.out.println("Test9------------------------------------"); 
       Toast.makeText(MyProfileActivity.this, "ERROR", Toast.LENGTH_SHORT).show(); 
       Exception error = result.getError(); 
       System.out.println("Test10------------------------------------"); 
      } 
     } 
    } 
} 

ルール

{ 
"rules": { 
    // User profiles are only readable/writable by the user who owns it 
    ".read": true, 
    ".write": true, 
    "users": { 
    "$UID": { 
     ".read": "auth.uid == $UID", 
     ".write": "auth.uid == $UID" 
    } 
    }, 

    // Posts can be read by anyone but only written by logged-in users. 
    "posts": { 
    ".read": true, 
    ".write": "auth.uid != null", 

    "$POSTID": { 
     // UID must matched logged in user and is fixed once set 
     "uid": { 
     ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid" 
     }, 

     // User can only update own stars 
     "stars": { 
     "$UID": { 
      ".validate": "auth.uid == $UID" 
     } 
     } 
    } 
    }, 

    // User posts can be read by anyone but only written by the user that owns it, 
    // and with a matching UID 
    "user-posts": { 
    ".read": true, 

    "$UID": { 
     "$POSTID": { 
     ".write": "auth.uid == $UID", 
      ".validate": "data.exists() || newData.child('uid').val() == auth.uid" 
     } 
    } 
    }, 


    // Comments can be read by anyone but only written by a logged in user 
    "post-comments": { 
    ".read": true, 
    ".write": "auth.uid != null", 

    "$POSTID": { 
     "$COMMENTID": { 
     // UID must matched logged in user and is fixed once set 
     "uid": { 
      ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid" 
     } 
     } 
    } 
    } 
} 
} 

答えて

0

あなたはこのような状況のために単一の値リスナーを使用することができます。あなたがそれをもう一度呼び出すまで聞いてはいません。一度

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Logic for success... 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

      // Logic for failure... 
     } 
    }); 

読むデータ:いくつかのケースでは あなたは、コールバックは一度呼ばれ、その後すぐに、このような変更を期待しないでくださいUI要素を初期化するときのように、削除する場合があります。 addListenerForSingleValueEvent()メソッドを使用すると、このシナリオを単純化することができます。トリガーは一度トリガーしてから再びトリガーしません。

original post from firebase

+0

は、それはまだ私がuser_db.child( "イメージ")をコメントアウトするとき.. – Eric

+0

私をサインアウトのsetValue(mImageUri.toString());それは私に署名しません。私はuser_db.child( "イメージ")に問題があると思う。setValue(mImageUri.toString()); – Eric

+0

設定値のコードに問題はありません。問題は、あなたのmDatabaseUser.child(mUser.getUid())にリスナーがあり、何かを変更すると、リスナーがトリガーされます。したがって、リスナーとaddListenerForSingleValueEventが機能するはずです。 mDatabaseUser.child(mUser.getUid())に他のアクティブなリスナーがありますか? – kagkar

関連する問題