Firebase Storage без токена аутентификации для запроса в Android - PullRequest
0 голосов
/ 01 августа 2020

Я не знаю, как описать эту проблему, поэтому перечислю задачи, которые мне нужно выполнить для приложения:

  1. Загрузите файл .txt из Firebase Cloud Storage
  2. Сохраните его в моем хранилище, указанном в приложении c,
  3. Получите файл из хранилища, указанном в приложении c, и прочтите его построчно.

Logcat:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/0/1/content://media/external/images/media/2328/ORIGINAL/NONE/image/png/1631689393 flg=0x1 clip={text/uri-list U:content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F2328/ORIGINAL/NONE/image%2Fpng/1631689393} }} to activity {com.example.android.getroasted/com.example.android.getroasted.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.MutableLiveData.observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer)' on a null object reference

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.lifecycle.MutableLiveData.observe(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Observer)' on a null object reference

Фрагмент:

private void setRoast() throws FileNotFoundException {
        homeViewModel.getRandomRoast().observe(getViewLifecycleOwner(), new Observer<byte[]>() {
            @RequiresApi(api = Build.VERSION_CODES.Q)
            @Override
            public void onChanged(byte[] bytes) {
                try (FileOutputStream fos = requireContext().openFileOutput("roasts", Context.MODE_PRIVATE)) {
                    fos.write(bytes);
                } catch (IOException e) {
                    Log.d(TAG, "IOException: " + e);
                }
            }
        });

        roastContainer.setVisibility(View.VISIBLE);
        FileInputStream fis = getContext().openFileInput("roasts");
        InputStreamReader inputStreamReader =
                new InputStreamReader(fis, StandardCharsets.UTF_8);
        StringBuilder stringBuilder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(inputStreamReader)) {
            String line = reader.readLine();
            while (line != null) {
                stringBuilder.append(line).append('\n');
                line = reader.readLine();
                Log.d(TAG, "roast: " + line);
            }
        } catch (IOException e) {
            // Error occurred when opening raw file for reading.
        } finally {
            String contents = stringBuilder.toString();
        }
    }

ViewModel:

public class HomeViewModel extends ViewModel {

    private static final String TAG = "HomeViewModel";
    FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
    StorageReference storageReference = firebaseStorage.getReference();
    private StorageReference roastDocRef = storageReference.child("roasts.txt");
    private MutableLiveData<byte[]> roastLiveData;

    public MutableLiveData<byte[]> getRandomRoast() {
        roastDocRef.getBytes(1024*1024)
                .addOnSuccessListener(new OnSuccessListener<byte[]>() {
                    @Override
                    public void onSuccess(byte[] bytes) {
                        Log.d(TAG, "bytes: " + bytes);
                        roastLiveData.postValue(bytes);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "could not download the roast doc " + e);
            }
        });
        return roastLiveData;
    }
}

Я не знаю, почему и где возникает проблема, но я уже пробовал эти вещи:

  • Проверил свои правила безопасности, они позволяют читать, писать
  • обновлен viewmodel.setValue () TO viewmodel.postValue ()

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Это не имеет ничего общего с токенами авторизации или правилами безопасности.

Сообщение об ошибке предполагает, что getRandomRoast() возвращает значение null. На самом деле, это происходит потому, что вы никогда не присваивали значение roastLiveData. Он всегда будет нулевым.

0 голосов
/ 01 августа 2020
while (line.hasNext) {
               stringBuilder.append(line).append('\n');
               line = reader.readLine();
               Log.d(TAG, "roast: " + line);
           }

попробуйте этот код

ВТОРОЕ, ПОПРОБУЙТЕ МОЙ КОД

File textfile = new File(address of file);
if (textFile.exists()) {
            // if file already exists
            // Reading data in text file 

            StringBuilder textdata = new StringBuilder("");
            try {
                Scanner myReader = new Scanner(textFile);
                while (myReader.hasNextLine()) {
                    String data = myReader.nextLine();
                    textdata.append(data);

                }
                myReader.close();
            } catch (FileNotFoundException e) {
                Log.d("vijaySee", "textWork: error in reading FIle");
                e.printStackTrace();
            }

//now textdata String has all the data for the user.

Убедитесь, что вы сначала загрузили файл, а затем прочитали данные в onsuccessListener ссылки на хранилище firebase. Перед загрузкой текстового файла чтение может вызвать исключение нулевого указателя.

Сначала просто загрузите файл, а затем используйте my, указав фактический адрес в скобках. Тогда в переменной textData будут все данные в строке, которая вам нужна.

...