Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class MainActivity extends AppCompatActivity {
- private FirebaseAnalytics mFirebaseAnalytics;
- private FirebaseAuth mFirebaseAuth;
- private DatabaseReference mPicDataReference;
- private FirebaseStorage mFirebaseStorage;
- private Button button;
- private ImageView imageView;
- private ProgressBar progressBar;
- private GridView gridView;
- private ArrayList<PictureItem> pictureItems;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //連結畫面
- button = findViewById(R.id.button2);
- imageView = findViewById(R.id.imageView);
- progressBar = findViewById(R.id.progressBar2);
- progressBar.setVisibility(View.INVISIBLE);//ProgressBar設為不可見
- gridView = findViewById(R.id.gridView);
- pictureItems = new ArrayList<>();
- // Obtain the FirebaseAnalytics instance.
- mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
- mFirebaseAuth = FirebaseAuth.getInstance();
- mPicDataReference = FirebaseDatabase.getInstance().getReference().child("pic");
- mFirebaseStorage = FirebaseStorage.getInstance();
- //匿名登入
- mFirebaseAuth.signInAnonymously();
- //取得firebase database 的照片檔案路徑後,顯示擴充到gridView
- mPicDataReference.addChildEventListener(new ChildEventListener() {
- @Override
- public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
- String path = dataSnapshot.child("path").getValue().toString();
- PictureItem pictureItem = new PictureItem(path);
- pictureItems.add(pictureItem);
- MyPictureListAdapter myPictureListAdapter = new MyPictureListAdapter();
- myPictureListAdapter.pictureItems = pictureItems;
- gridView.setAdapter(myPictureListAdapter);
- }
- @Override
- public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
- }
- @Override
- public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
- }
- @Override
- public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
- }
- @Override
- public void onCancelled(@NonNull DatabaseError databaseError) {
- }
- });
- //擷取照片按鈕監聽器
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setType("image/*");//開啟Pictures畫面Type設定為image
- intent.setAction(Intent.ACTION_GET_CONTENT);//使用Intent.ACTION_GET_CONTENT這個Action
- startActivityForResult(intent, 0);//取得照片後返回此畫面
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- //當使用者按下確定後
- if(resultCode == RESULT_OK){
- //取得圖檔的路徑位置
- Uri uri = data.getData();
- //抽象資料的接口
- ContentResolver cr = this.getContentResolver();
- try {//由抽象資料接口轉換圖檔路徑為Bitmap
- final Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
- //使用UUID為上傳檔名
- String fileName = UUID.randomUUID().toString() + ".jpg";
- //壓縮bitmap到ByteArrayOutputStream baos
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
- //設定bitmap到imageView
- imageView.setImageBitmap(bitmap);
- //帶有bitmap的ByteArrayOutputStream baos 轉成byte[]
- byte[] imageData = baos.toByteArray();
- //建立上傳圖片的metadata
- StorageMetadata storageMetadata = new StorageMetadata
- .Builder().setCustomMetadata("MyKey", "MyValue").build();
- //參考到firebase storage的/pic/uid/fileName位址
- final StorageReference mountainsRef = mFirebaseStorage.getReference()
- .child("pic")
- .child(mFirebaseAuth.getCurrentUser().getUid())
- .child(fileName);
- //用byte[]上傳圖檔到firebase storage
- UploadTask uploadTask = mountainsRef.putBytes(imageData, storageMetadata);
- //把上傳進度條設為顯示
- progressBar.setVisibility(View.VISIBLE);
- //上傳圖片到firebase storage的監聽器設定
- uploadTask.addOnFailureListener(new OnFailureListener() {
- @Override//上傳失敗執行
- public void onFailure(@NonNull Exception e) {
- Toast.makeText(MainActivity.this, "上傳失敗", Toast.LENGTH_LONG).show();
- progressBar.setVisibility(View.INVISIBLE);
- }
- }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
- @Override//上傳成功執行
- public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
- Toast.makeText(MainActivity.this, "上傳成功", Toast.LENGTH_LONG).show();
- //把上傳此照片的uid、下載路徑、檔案路徑記錄到Firebase Database/pic/自動key/
- HashMap<String, String> picData = new HashMap<>();
- picData.put("uid", mFirebaseAuth.getCurrentUser().getUid());
- picData.put("link", mountainsRef.getDownloadUrl().toString());
- picData.put("path", mountainsRef.getPath());
- mPicDataReference.push().setValue(picData);
- //隱藏上傳進度條
- progressBar.setVisibility(View.INVISIBLE);
- }
- }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
- @Override//正在上傳圖片時顯示進度bar
- public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
- int progressPercentage = (int) ((taskSnapshot.getBytesTransferred() * 100)
- / (taskSnapshot.getTotalByteCount()));
- Log.d("uploading", progressPercentage+"%");
- progressBar.setProgress(progressPercentage);
- }
- });
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
- //Gird View 用的 Adapter
- private class MyPictureListAdapter extends BaseAdapter {
- ArrayList<PictureItem> pictureItems;
- @Override
- public int getCount() {
- return pictureItems.size();
- }
- @Override
- public PictureItem getItem(int position) {
- return pictureItems.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- LayoutInflater mInflater = getLayoutInflater();
- View myView = mInflater.inflate(R.layout.image_grid, null);
- final PictureItem pictureItem = pictureItems.get(position);
- ImageView imageView = (ImageView)myView.findViewById(R.id.imageView2);
- //使用 FirebaseUI 下載圖片
- Glide.with(MainActivity.this)
- .load(mFirebaseStorage.getReference().child(pictureItem.imagePath))
- .into(imageView);
- return myView;
- }
- }
- }
Add Comment
Please, Sign In to add comment