android - 如何使用 kotlin 将图像上传到 Firebase
问题描述
这就是我要走的路。我对获取实例并以 URI 格式获取我的图片的引用感到困惑。
这是代码:
class MainActivity : AppCompatActivity(), View.OnClickListener {
private val CAMERA_REQUEST_CODE = 12345
private val REQUEST_GALLERY_CAMERA = 54654
companion object {
val TAG = "RegisterActivity"
}
val storage = FirebaseStorage.getInstance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
scnbtn.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v) {
scnbtn -> {
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_GALLERY_CAMERA)
} else {
openCamera()
}
} else {
openCamera()
}
}
}
}
private fun openCamera() {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (intent.resolveActivity(packageManager) != null)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_GALLERY_CAMERA) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
openCamera()
Log.d(TAG, "Button Pressed")
} else {
Toast.makeText(this@MainActivity, "Fail", Toast.LENGTH_SHORT).show()
}
}
}
var selectedPhotoUri: Uri? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
CAMERA_REQUEST_CODE -> {
val extras = data?.getExtras()
val imageBitmap = extras?.get("data") as Bitmap
imagecap.setImageBitmap(imageBitmap)
val bytes = baos.toByteArray()
//FIREBASE
uploadImageToFirebaseStorage()
}
}
}
}
private fun uploadImageToFirebaseStorage() {
if (imagecap == null) return
val filename = "images/" + UUID.randomUUID().toString()
val ref = storage.getReference(filename)
ref.putFile(imagecap!!)
.addOnSuccessListener {
Log.d(TAG, "Successfully uploaded image: ${it.metadata?.path}")
ref.downloadUrl.addOnSuccessListener {
Log.d(TAG, "File Location: $it")
}
}
.addOnFailureListener {
Log.d(TAG, "Failed to upload image to storage: ${it.message}")
}
}
}
代码工作正常,直到它到达 firebase 部分。我无法让上传工作。它怎么知道firebase存储在哪里?
解决方案
例如,尝试使用此代码来引用:
private fun getFileExtension(uri: Uri?): String? {
val cR = activity!!.contentResolver
val mime = MimeTypeMap.getSingleton()
return mime.getExtensionFromMimeType(cR.getType(uri!!))
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) {
val selectedfile = data!!.data //The uri with the location of the file
val fname = getFileName(selectedfile)
val file = FileUtils.getFile(activity, selectedfile)
val storage = FirebaseStorage.getInstance()
val storageRef = storage.reference
val progressDialog = ProgressDialog(getContext())
progressDialog.setTitle("Uploading")
progressDialog.show()
val fileReference = mStorageRef!!.child(System.currentTimeMillis().toString()
+ "." + getFileExtension(selectedfile))
var bitmap: Bitmap? = null
try {
bitmap = MediaStore.Images.Media.getBitmap(activity!!.contentResolver, selectedfile)
} catch (e: IOException) {
e.printStackTrace()
}
val baos = ByteArrayOutputStream()
bitmap!!.compress(Bitmap.CompressFormat.JPEG, 20, baos)
val dat = baos.toByteArray()
val uploadTask = fileReference.putBytes(dat)
uploadTask.addOnFailureListener { exception -> Log.i("whatTheFuck:", exception.toString()) }.addOnSuccessListener {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
progressDialog.dismiss()
Toasty.success(getContext()!!, "Image Uploaded", Toast.LENGTH_LONG, true).show()
uploadTask.continueWithTask { task ->
if (!task.isSuccessful) {
}
fileReference.downloadUrl
}.addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
//DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(mAu.getInstance().getCurrentUser().getUid());
val url = downloadUri!!.toString()
Log.i("seeThisUri", downloadUri.toString())// This is the one you should store
db!!.collection(s!!).document(docname!!)
.update(
"imageurl", url
)
// Upload upload = new Upload(editTextName.getText().toString().trim(),
// Toast.makeText(getContext(),url,Toast.LENGTH_LONG).show();
// String uploadId = ref.push().getKey();
//ref.child(uploadId).setValue(upload);
} else {
Toasty.info(getContext()!!, "Image Not Selected", Toast.LENGTH_LONG, true).show()
}
}
}.addOnProgressListener { taskSnapshot ->
val progress = 100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount
progressDialog.setMessage("Uploaded " + progress.toInt() + "%...")
}
} else if (requestCode == REQUEST_CAMERA && resultCode == Activity.RESULT_OK) {
val extras = data!!.extras
val selectedfile = extras!!.get("data") as Bitmap
val imageuri = getImageUri(activity!!, selectedfile)
val fname = getFileName(imageuri)
val file = FileUtils.getFile(activity, imageuri)
val storage = FirebaseStorage.getInstance()
val storageRef = storage.reference
val progressDialog = ProgressDialog(getContext())
progressDialog.setTitle("Uploading")
progressDialog.show()
val fileReference = mStorageRef!!.child(System.currentTimeMillis().toString()
+ "." + getFileExtension(imageuri))
var bitmap: Bitmap? = null
try {
bitmap = MediaStore.Images.Media.getBitmap(activity!!.contentResolver, imageuri)
} catch (e: IOException) {
e.printStackTrace()
}
val baos = ByteArrayOutputStream()
bitmap!!.compress(Bitmap.CompressFormat.JPEG, 20, baos)
val dat = baos.toByteArray()
val uploadTask = fileReference.putBytes(dat)
uploadTask.addOnFailureListener { exception -> Log.i("whatTheFuck:", exception.toString()) }.addOnSuccessListener {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
progressDialog.dismiss()
Toasty.success(getContext()!!, "Image Uploaded", Toast.LENGTH_LONG, true).show()
uploadTask.continueWithTask { task ->
if (!task.isSuccessful) {
}
fileReference.downloadUrl
}.addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
//DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(mAu.getInstance().getCurrentUser().getUid());
val url = downloadUri!!.toString()
Log.i("seeThisUri", downloadUri.toString())// This is the one you should store
db!!.collection(s!!).document(docname!!)
.update(
"imageurl", url
)
// Upload upload = new Upload(editTextName.getText().toString().trim(),
// Toast.makeText(getContext(),url,Toast.LENGTH_LONG).show();
// String uploadId = ref.push().getKey();
//ref.child(uploadId).setValue(upload);
} else {
Toasty.info(getContext()!!, "Image Not Selected", Toast.LENGTH_LONG, true).show()
}
}
}.addOnProgressListener { taskSnapshot ->
val progress = 100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount
progressDialog.setMessage("Uploaded " + progress.toInt() + "%...")
}
}
}
private fun getImageUri(context: Context, inImage: Bitmap): Uri {
val bytes = ByteArrayOutputStream()
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
val path = MediaStore.Images.Media.insertImage(context.contentResolver, inImage, "Title", null)
return Uri.parse(path)
}
fun getFileName(uri: Uri?): String {
var result: String? = null
if (uri!!.scheme == "content") {
val cursor = activity!!.contentResolver.query(uri, null, null, null, null)
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
}
} finally {
cursor!!.close()
}
}
if (result == null) {
result = uri.path
val cut = result!!.lastIndexOf('/')
if (cut != -1) {
result = result.substring(cut + 1)
}
}
return result
}
推荐阅读
- python - 如何获取未安装的 pip 包的简短描述和详细描述?
- javascript - Firefox execCommand 不需要 preventDefault
- python - 使用 pyppeteer 创建 for 循环的理想方法
- javascript - 在 Three.js 中的场景内创建尺寸指示器
- javascript - 使用 GraphQL 时如何使用数据库验证某些字段?
- elasticsearch - spring-data-elasticsearch - 当@Id 在同一字段上注释时,@Field 映射类型被忽略
- go - 如何获取指针的地址?
- c++ - 无法使用自定义信号连接两个帧
- c++ - graphics.h 头文件可以在 64 位窗口上工作吗?
- kubernetes - Kubernetes 控制器管理器 pod 未更新