我有一个Android应用程序,它通过Google(或Gmail)的用户授权,我要为每个新用户节省了Google+的头像火力地堡存储,以便使用该应用程序的地方。
我可以通过调用GoogleSignInAccount
得到personPhoto = account.getPhotoUrl();
化身的URI。
之后,我要上传的头像火力地堡寄存,这样我就可以节省我的火力地堡数据库供用户链接到化身(在这个数据库中的一个字段将持有用户的头像)。
我一直在阅读关于如何上传文件到火力地堡存储this指南。我已经意识到用户的头像不会在手机的‘真正’的存在,但我只有其开放的地方在我的代码。
一个可能的解决方案是化身下载到某个文件夹上的电话,然后用我上面提到的指南。
不过,我不知道如何下载,我想是不是这个问题的最佳解决方案。
什么是这里的选项?
这里是我的onStart
方法MainActivity
,不工作的代码,因为形象不上手机下载。
protected void onStart() {
super.onStart();
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
databaseUsers = FirebaseDatabase.getInstance().getReference("users");
if (account == null) {
username.setText("Need to sign in");
email.setText("");
avatar.setImageResource(android.R.color.transparent);
}
else {
personName = account.getDisplayName();
personGivenName = account.getGivenName();
personFamilyName = account.getFamilyName();
personEmail = account.getEmail();
personId = account.getId();
personPhoto = account.getPhotoUrl();
username.setText(account.getDisplayName());
email.setText(account.getEmail());
final String cleanEmail = email.getText().toString().replaceAll("\\.", ",");
databaseUsers.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (!snapshot.child(cleanEmail).exists()) {
mProgress.setMessage("LUL");
mProgress.show();
mStorage = FirebaseStorage.getInstance().getReference();
InputStream stream = null;
try {
stream = new FileInputStream("some path here");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
StorageReference filePath = mStorage.child("Avatar").child(personPhoto.getPath());
UploadTask uploadTask = filePath.putStream(stream);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUrl = taskSnapshot.getDownloadUrl();
mProgress.dismiss();
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if(account.getPhotoUrl() != null){
Picasso.with(this).load(account.getPhotoUrl()).into(avatar);
}
else {
avatar.setImageResource(R.drawable.userdefault);
}
}
}
你可以存储下载的网址,然后将其保存到数据库中的用户/帐户等。在这个例子中,我使用的反应母语。我下载的URL保存到一个数组,然后存储阵列到数据库中。
export const userVehiclePhotoUploadRequest = (photos, user, year) => dispatch => {
console.log('Inside vehiclePhotoUpload Actions', photos, user)
let referenceToUploadedPhotos = [];
return new Promise((resolve, reject) => {
photos.map(ele => {
let mime = 'application/octet-stream'
let uri = ele.uri
let uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri
let sessionId = new Date().getTime()
let uploadBlob = null
let imageRef = firebase.storage().ref('vehicleImages/' + `${user.account.uid}`).child(`${sessionId}`)
fs.readFile(uploadUri, 'base64')
.then((data) => {
return Blob.build(data, { type: `${mime};BASE64` })
})
.then((blob) => {
uploadBlob = blob
return imageRef.put(blob, { contentType: mime })
})
.then(() => {
uploadBlob.close()
return imageRef.getDownloadURL()
})
.then((url) => {
referenceToUploadedPhotos.push(url)
console.log('ARRAY OF URLS WHILE PUSHING', referenceToUploadedPhotos)
resolve(url)
})
.catch((error) => {
reject(error)
})
})
})
.then(() => {
//I did this to not go home until photos are done uploading.
let vehicles;
firebase.database().ref('users/' + user.account.uid + `/allVehicles/allVehiclesArray`).limitToFirst(1).once('value').then(function (snapshot) {
// ******** This method is straight from their docs ********
// ******** It returns whatever is found at the path xxxxx/users/user.uid ********
vehicles = snapshot.val();
}).then(() => {
console.log('ARRAY OF URLS BEFORE SETTING', referenceToUploadedPhotos)
// let lastVehicle = vehicles.length - 1;
firebase.database().ref('users/' + user.account.uid + `/allVehicles/allVehiclesArray/` + `${Object.keys(vehicles)[0]}` + `/photosReference`).set({
referenceToUploadedPhotos
}).then(() => {
dispatch(loginRequest(user.account))
})
})
})
};
如果你有一张照片,有效的方法是将照片上传到服务器并获取其URL
并再次将其保存到数据库中,你的情况下,它已经在服务器(谷歌的服务器),为什么你要上传它,而你可以而它(谷歌的服务器)存在使用它,
保存从谷歌在你的数据库获得,当你需要的图像只是去拿URL
在执行该URL
图像的URL
但是,如果你想下面的图片上传自到火力地堡你如何得到它
public Bitmap getBitmapFromURL(String src) {
try {
java.net.URL url = new java.net.URL(src);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
并上传位图火力检查this