我有一个Android应用程序,它通过Google+(或Gmail)获得用户授权,我希望每个新用户将其Google+头像保存到Firebase存储,以便在应用中使用它。
我可以通过调用data=new HashMap<>();
从GoogleSignInAccount
获取头像的Uri。
之后,我想将头像上传到Firebase存储,因此我可以在我的Firebase数据库中为用户保存该头像的链接(此数据库中的某个字段将保留用户&#39;头像)。
我一直在阅读有关如何将文件上传到Firebase存储的this指南。我已经意识到用户&#39;手机上不存在头像&#34;对于真实&#34;,但我的代码中只有它的Uri。
一种可能的解决方案是将头像下载到手机上的某个文件夹中,然后使用我上面提到的指南。
但是,我不知道如何下载,我认为这不是解决此问题的最佳方法。
这里有什么选择?
以下是personPhoto = account.getPhotoUrl();
中onStart
方法的代码,但由于未在手机上下载头像,因此无效。
MainActivity
答案 0 :(得分:0)
您可以存储下载URL,然后将其保存到用户/帐户等下的数据库中。在此示例中,我使用react-native。我将下载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))
})
})
})
};
答案 1 :(得分:0)
如果您有照片,有效的方法是将照片上传到服务器并获取其URL
并将其保存到数据库,
在你的情况下,它已经在服务器(谷歌的服务器)中,为什么你想要再次上传它,而你可以使用它(谷歌的服务器),
将您从Google获得的图片的URL
保存在您的数据库中,当您需要图片时,只需获取URL
执行URL
但是,如果你想将图片自己上传到Firebase,那么你如何获得它
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;
}
}
并将位图上传到Firebase,然后检查this