2017-02-10 43 views
0

感谢您的阅读。我正在研究MyAccountActivity,用户将可以更改他们的个人资料图片。我在这里做的是当在onActivityResult()方法中完成裁剪图像时,程序将更改当前用户的图像值。当图像值发生变化时,onCreate()方法中的addValueEventListener会再次出现以读取该值并将该图像url或字符串存储到Picasso中,就像我在addValueEventListener中那样。但是,应用程序会在裁剪后自动将我签名。Android Firebase - 用户在更改子数据后自动注销

通过打印出mImageUrl,我注意到当我成功裁剪了我的图像后,它改变了它的值,但是一秒钟之后它又回到上一张图片,然后它将我注销。

任何人都可以帮助我吗?谢谢。

MyProfileActivity.java

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

它仍然签署我.. – Eric

+0

当我注释掉user_db.child( “图像”)的setValue(mImageUri.toString())。 ,它不会让我出去。我认为user_db.child(“image”)有问题。setValue(mImageUri.toString()); – Eric

+0

您的设定值代码没有问题。问题是你的mDatabaseUser.child(mUser.getUid())有一个监听器,当你改变它的任何事情时,监听器会触发。所以,这是关于你的监听器和addListenerForSingleValueEvent应该工作。 mDatabaseUser.child(mUser.getUid())上还有其他活动侦听器吗? – kagkar