【问题标题】:How to upload video files from WhatsApp Video Folder to Firebase on android device?如何将视频文件从 WhatsApp 视频文件夹上传到 Android 设备上的 Firebase?
【发布时间】:2021-05-11 01:34:27
【问题描述】:

我想创建 android 应用程序,其中应该是在 firebase 上上传文件的一种方式。但即使在授予运行时存储权限后,视频也不会以某种方式上传。

这是我的 MainActivity.java 文件代码

public class MainActivity extends AppCompatActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback{

    private static final int PERMISSION_REQUEST_STORAGE = 0;
    private final String[] REQUIRED_PERMISSIONS = new String[]{
            "android.permission.WRITE_EXTERNAL_STORAGE",
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.INTERNET"
    };

    FireBaseHandler fb;

    private View mLayout;

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

        fb = new FireBaseHandler();

        mLayout = findViewById(R.id.main_layout);

        // Check if the permission has been granted
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            // Permission is already available, start camera preview
            Snackbar.make(mLayout,
                    "Permission_Available",
                    Snackbar.LENGTH_SHORT).show();
            fb.upload();
        } else {
            // Permission is missing and must be requested.
            requestPermission();
        }

        /*

        if(allPermissionsGranted()){
            fb.Upload(); //start upload if permission has been granted by user
        } else{
            ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
        }
        */
    }

    /*
    private boolean allPermissionsGranted(){

        for(String permission : REQUIRED_PERMISSIONS){
            if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                return false;
            }
        }
        return true;
    }
    */

    private void requestPermission() {
        // Permission has not been granted and must be requested.
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // Display a SnackBar with cda button to request the missing permission.
            Snackbar.make(mLayout, "camera_access_required",
                    Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // Request the permission
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            PERMISSION_REQUEST_STORAGE);
                }
            }).show();

        } else {
            Snackbar.make(mLayout, "Storage_unavailable", Snackbar.LENGTH_SHORT).show();
            // Request the permission. The result will be received in onRequestPermissionResult().
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_STORAGE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        // BEGIN_INCLUDE(onRequestPermissionsResult)
        if (requestCode == PERMISSION_REQUEST_STORAGE) {
            // Request for camera permission.
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission has been granted. Start camera preview Activity.
                Snackbar.make(mLayout, "camera_permission_granted",
                        Snackbar.LENGTH_SHORT)
                        .show();
                fb.upload();
            } else {
                // Permission request was denied.
                Snackbar.make(mLayout, "Storage_permission_denied",
                        Snackbar.LENGTH_SHORT)
                        .show();
            }
        }
        // END_INCLUDE(onRequestPermissionsResult)
    }


    /*
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        if(requestCode == REQUEST_CODE_PERMISSIONS){
            if(allPermissionsGranted()){
                fb.Upload();
            } else{
                Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show();
                this.finish();
            }
        }
    }
    */
}

这是上传文件的代码

public class FireBaseHandler {

    private static final String TAG = "MyFirebase";

    FirebaseStorage storage; // = FirebaseStorage.getInstance();
    // Create a storage reference from our app
    StorageReference storageRef; // = storage.getReference();
    UploadTask uploadTask;

    public FireBaseHandler() {
        storage = FirebaseStorage.getInstance();
        storageRef = storage.getReference();
    }

    public void upload(){

        Uri file = Uri.fromFile(new File(getWhatsAppVideoDirectory()+"Abc.mp4"));
        StorageReference vidRef = storageRef.child("videos/"+file.getLastPathSegment());
        uploadTask = vidRef.putFile(file);

        // Register observers to listen for when the download is done or if it fails
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                Log.i(TAG,"onFailure");
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
                // ...
                Log.i(TAG,"onSuccess");
            }
        });

    }

    private String getWhatsAppVideoDirectory() {
        String folder_path = (Environment.getExternalStorageDirectory().getAbsolutePath() +
                "/WhatsApp/Media/WhatsApp Video/Sent/");

        //new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media");

        return folder_path;
    }

}

错误类似于访问被拒绝,请告诉我我在哪里做错了。

我已经使用 6.0.1 的较低版本的 android 运行了此代码,并且运行良好。不知道谷歌对较新的android版本有没有一些变化?

【问题讨论】:

  • “错误类似于...” 如果没有看到原始错误消息,很难帮助解决错误。信息的一般描述或释义通常没有帮助。请编辑您的帖子以包含任何错误消息的确切 措辞,包括任何异常的完整stack trace(如果适用)以及堆栈跟踪指向的代码行。请参阅How to Ask 和How to create a Minimal, Reproducible Example

标签: android firebase android-studio local-storage whatsapp


【解决方案1】:

我刚刚发现您没有正确请求许可;

ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_STORAGE);

这里你只是请求读取权限,当你在清单中声明时,读取权限总是正确的,但在运行时你应该请求 WRITE_EXTERNAL_STORAGE。所以上面的代码没有任何意义,因为它总是正确的。您必须像这样请求许可:

ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                PERMISSION_REQUEST_STORAGE);

【讨论】:

  • 但我只想读取文件或访问文件以便上传。我现在不写文件了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2020-12-10
  • 2016-10-30
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多