我想用相机拍照,然后想将该照片(用相机拍摄)上传到firebase存储。我研究了许多与此相关的问题,但这对我没有任何意义。这是我的代码。
package com.ivtech.shah.yunas.fireapp;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
public class ActivityCamera extends AppCompatActivity {
private static final int CAMERA_REQUEST_CODE=1;
private static final int GALLERY_REQUEST = 2;
Bitmap imageBitmap = null;
private ImageButton takepic;
private EditText mDescription;
private Button mSavebtn;
private ProgressDialog mProgress;
private StorageReference mStorage;
private DatabaseReference mDatabase;
private Uri imageUri=null;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
takepic= (ImageButton) findViewById(R.id.imagebtntotakepic);
mDescription = (EditText) findViewById(R.id.editTextCameraDesc);
mSavebtn= (Button) findViewById(R.id.btnstartsaving);
mProgress= new ProgressDialog(this);
mAuth = FirebaseAuth.getInstance();
mStorage= FirebaseStorage.getInstance().getReference();
mDatabase = FirebaseDatabase.getInstance().getReference().child("UsersData");
takepic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
mSavebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSaving();
}
});
}
// Save button funtion
private void startSaving() {
mProgress.setMessage("Uploading Your Data..");
final String descrition_txt =mDescription.getText().toString().trim();
if (!TextUtils.isEmpty(descrition_txt) && imageBitmap!=null){
mProgress.show();
StorageReference filepath= mStorage.child("Saved_Images").child(imageUri.getLastPathSegment());
filepath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(ActivityCamera.this,"Uploading Finished!",Toast.LENGTH_LONG).show();
}
}) ;
mProgress.dismiss();
}
}
@Override
protected void onStart() {
if (imageBitmap==null ) {
Intent intent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,CAMERA_REQUEST_CODE);
}
super.onStart();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==CAMERA_REQUEST_CODE && resultCode==RESULT_OK){
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
takepic.setImageBitmap(imageBitmap);
// Actually this uri is null, im confuse in this
Uri imageuri= data.getData();
takepic.setImageURI(imageuri);
StorageReference filepath= mStorage.child("Saved_Images").child(imageUri.getLastPathSegment());
filepath.putFile(imageuri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
String user_id = mAuth.getInstance().getCurrentUser().getUid();
Uri downloadUrl = taskSnapshot.getDownloadUrl();
//DatabaseReference newPost = mDatabase.child(user_id).push();
DatabaseReference newPost = mDatabase.push();
// newPost.child("title").setValue(title_txt);
newPost.child("image").setValue(downloadUrl.toString());
Toast.makeText(ActivityCamera.this, "worked ", Toast.LENGTH_SHORT).show();
}
});
}}
}
我听说我需要将uri转换为base64,但我无法做任何建议或我需要在此代码中进行更改。
答案 0 :(得分:0)
如果您想捕获图片并将该图片上传到firebase,那么我希望这段代码能为您提供帮助。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photo);
intent = getIntent();
user = FirebaseAuth.getInstance().getCurrentUser();
getUserToken();
database = FirebaseDatabase.getInstance();
myDBRef = database.getReference("profile");
mStorage = FirebaseStorage.getInstance().getReference().child("profile_photo").child(userUid);
mProgressDialog = new ProgressDialog(this);
selectedIV = (ImageView)findViewById(R.id.selected_imageView);
uploadButton = (Button)findViewById(R.id.upload_button);
uploadButton.setVisibility(View.GONE);
fromCamera = (Button)findViewById(R.id.from_camera_button);
fromCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
// use standard intent to capture an image
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File direct = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
if (!direct.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
wallpaperDirectory.mkdirs();
}
destination = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/perfectDatingProfile", "cropped.png"));
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, destination);
startActivityForResult(captureIntent, 1);
} catch (ActivityNotFoundException anfe) {
}
}
});
laterButton = (Button)findViewById(R.id.later_button);
uploadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadPicture();
}
});
myRef = FirebaseDatabase.getInstance().getReference();
selectImageButton = (Button) findViewById(R.id.select_photo_button);
laterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String userName = intent.getExtras().getString("userName");
String sex = intent.getExtras().getString("sex");
String uid = intent.getExtras().getString("uid");
Integer year = intent.getExtras().getInt("year");
Integer month = intent.getExtras().getInt("month");
Integer dayOfMonth = intent.getExtras().getInt("dayOfMonth");
Double latitude = intent.getExtras().getDouble("latitude");
Double longitude = intent.getExtras().getDouble("longitude");
userObj = new ProfileModel(userName,sex,uid,year,month,dayOfMonth,latitude,longitude,"none", "none");
myRef.child("profile").child(userObj.getUid()).setValue(userObj);
startActivity(new Intent(PhotoActivity.this,BaseActivity.class));
}
});
if(intent.getExtras() == null){
laterButton.setVisibility(View.GONE);
}
selectImageButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent cropIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
cropIntent.putExtra("crop","true");
cropIntent.putExtra("aspectX",1);
cropIntent.putExtra("aspectY",1);
cropIntent.putExtra("return-data",false);
Log.d("------",Environment.getExternalStorageDirectory().toString());
File direct = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
if (!direct.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
wallpaperDirectory.mkdirs();
}
destination = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/perfectDatingProfile", "cropped.png"));
cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, destination);
startActivityForResult(cropIntent, 2);
}
});
ProfileModel sharedModel = getPreferences();
if (sharedModel !=null){
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/perfectDatingProfile/profile.jpg");
selectedIV.setImageBitmap(bitmap);
}
}
之后,您可以将图像存储在SD卡中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GALLEY_INTENT && resultCode == RESULT_OK){
selectedIV.setImageURI(destination);
imageFile = new File(destination.getPath());
uploadButton.setVisibility(View.VISIBLE);
toastFilesize();
Bitmap bigProfile = BitmapFactory.decodeFile(destination.getPath());
smallProfile = Bitmap.createScaledBitmap(bigProfile,250,250,false);
bitmapToFile(smallProfile,"smallProfile");
}else if (requestCode == 1 && resultCode == RESULT_OK){
selectedIV.setImageURI(destination);
imageFile = new File(destination.getPath());
uploadButton.setVisibility(View.VISIBLE);
toastFilesize();
Bitmap bigProfile = BitmapFactory.decodeFile(destination.getPath());
smallProfile = Bitmap.createScaledBitmap(bigProfile,250,250,false);
bitmapToFile(smallProfile,"smallProfile");
}
}
private void toastFilesize(){
Cursor returnCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
Toast.makeText(PhotoActivity.this,Long.toString(returnCursor.getLong(sizeIndex)),Toast.LENGTH_LONG).show();
}
private void bitmapToFile(Bitmap bitmap, String name) {
smallImageFile = new File(Environment.getExternalStorageDirectory()+"/perfectDatingProfile", "small.jpg");
OutputStream os;
try {
os = new FileOutputStream(smallImageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
os.flush();
os.close();
Log.d("------",imageFile.getAbsolutePath().toString());
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
}
}
现在您可以使用uploadfpicture();
将图像存储在firebase上 private void uploadPicture(){
StorageReference filepath = mStorage.child("profile");
mProgressDialog.setMessage("Uploading.....");
mProgressDialog.show();
filepath.child("small").putFile(Uri.fromFile(smallImageFile)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
Log.d("2112","success upload small file" + userUid);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(PhotoActivity.this,"Upload Failed..",Toast.LENGTH_LONG).show();
}
});
filepath.putFile(Uri.fromFile(imageFile)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
downloadUri = taskSnapshot.getDownloadUrl();
storeToLocal();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(PhotoActivity.this,"Upload Failed..",Toast.LENGTH_LONG).show();
}
});
}
private void getUserToken(){
if (user != null) {
userUid = user.getUid();
}
}
private void storeToLocal(){
islandRef = mStorage.child("profile");
try {
localFile = File.createTempFile("images", "jpg");
} catch (IOException e) {
e.printStackTrace();
}
islandRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
downloadUri = uri;
islandRef.child("small").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
smallUri = uri;
uploadUserObj();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
}
private ProfileModel getPreferences(){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
Gson gson = new Gson();
String json = preferences.getString("myProfile", "");
ProfileModel obj = gson.fromJson(json, ProfileModel.class);
return obj;
}
private void uploadUserObj(){
if(intent.getExtras() == null){
ProfileModel sharedModel = getPreferences();
sharedModel.setPhotoUrl(downloadUri.toString());
sharedModel.setSmallProfileUri(smallUri.toString());
myRef.child("profile").child(sharedModel.getUid()).setValue(sharedModel);
Log.d("------","from other activity");
}else {
Log.d("------","from profile activity");
String userName = intent.getExtras().getString("userName");
String sex = intent.getExtras().getString("sex");
String uid = intent.getExtras().getString("uid");
Integer year = intent.getExtras().getInt("year");
Integer month = intent.getExtras().getInt("month");
Integer dayOfMonth = intent.getExtras().getInt("dayOfMonth");
Double latitude = intent.getExtras().getDouble("latitude");
Double longitude = intent.getExtras().getDouble("longitude");
userObj = new ProfileModel(userName,sex,uid,year,month,dayOfMonth,latitude,longitude,downloadUri.toString(), smallUri.toString());
myRef.child("profile").child(userObj.getUid()).setValue(userObj);
}
islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
bitmapServer = BitmapFactory.decodeFile(localFile.getAbsolutePath());
createDirectoryAndSaveFile(bitmapServer,"profile.jpg");
mProgressDialog.dismiss();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
mProgressDialog.dismiss();
}
});
}
private void createDirectoryAndSaveFile(Bitmap imageToSave, String fileName) {
File direct = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
if (!direct.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile");
wallpaperDirectory.mkdirs();
}
File file = new File(new File(Environment.getExternalStorageDirectory() + "/perfectDatingProfile"), fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
startActivity(new Intent(PhotoActivity.this,BaseActivity.class));
} catch (Exception e) {
e.printStackTrace();
}
}
public Bitmap getBitmapFromURL(String imageUrl) {
try {
URL url = new URL(imageUrl);
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;
}
}