Приложение не будет подключаться к хранилищу Firebase — не откроется, ошибок нет

Я проходил через учебник, чтобы создать диктофон, который затем загрузит запись в Firebase. Я смотрел учебник много раз и убедился, что приложение подключено к Firebase; однако приложение не откроется прямо сейчас, скорее всего, из-за этой проблемы. Я довольно новичок в программировании Java. Может кто-то, пожалуйста, предоставить мне некоторые рекомендации? Спасибо!

package bfb.ess.myapplicationbfb;

import android.app.ProgressDialog;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.gms.tasks.OnSuccessListener;

import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.File;
import java.io.IOException;

public class speakp extends AppCompatActivity {

    private Button mRecordBtn;
    private TextView mRecordlabel;

    private MediaRecorder mRecorder;

    private String mFileName = null;

    private static final String LOG_TAG = "Record_log";

    private StorageReference mStorage;


    private ProgressDialog mProgress;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recordpage);

        mStorage = FirebaseStorage.getInstance().getReference();

        mRecordlabel = (TextView) findViewById(R.id.recordlabel);
        mRecordBtn =(Button) findViewById(R.id.recordBtn);

        mProgress = new ProgressDialog(this);

        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName +="/recorded_audio.3gp";

        mRecordBtn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

                    startRecording();

                    mRecordlabel.setText("Recording Started ...");

                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

                    stopRecording();

                    mRecordlabel.setText("Recording Stopped ...");
                }


                return false;
            }
        });
    }

    private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;

        uploadAudio();
    }

    private void uploadAudio() {



        mProgress.setMessage("Uploading Audio ...");
        mProgress.show();

        StorageReference filepath = mStorage.child("Audio").child("new_audio.3gp");

        Uri uri = Uri.fromFile(new File(mFileName));

        filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                mProgress.dismiss();

                mRecordlabel.setText("Uploading Finished");

            }
        });

    }
}

2 ответа

  1. Перейдите в консоль Firebase и обновите правила чтения и записи для хранилища

    Вы можете посмотреть пример Google Firebase: образец хранения

    Проверьте URI аудиофайла, если он правильный. Потому что я предполагаю, lastPathSegment of uri становится неисправен.

    по умолчанию:

    service firebase.storage {
      match /b/<name_of_app>/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    Обновите его до:

    service firebase.storage {
          match /b/<name_of_app>/o {
            match /{allPaths=**} {
              allow read;
              allow write;
            }
          }
        }
    

    Примечание:
    Это обновление позволит вам хранить данные, даже если вы не авторизованы.
    Это только для целей разработки, потому что это может вызвать проблему безопасности доступа к данным без получения авторизации.
    Поэтому будьте осторожны при загрузке приложения в play store, обновите этот параметр и измените его в соответствии с вашими требованиями.

  2. Необходимо обновить правила чтения и записи для хранилища в консоли firebase,

    Перейдите в консоль Firebase, выберите Хранилище
    Нажмите на вкладку правила

    по умолчанию:

    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    Изменить на:

    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write;
        }
      }
    }
    

    как Mohom.R сказал

    Примечание: это обновление позволит вам хранить данные, даже если вы не авторизованы. Это только для целей разработки, потому что это может вызвать проблему безопасности доступа к данным без получения авторизации. Поэтому будьте осторожны при загрузке приложения в play store, обновите этот параметр и измените его в соответствии с вашими требованиями.