首页 > 解决方案 > 首次安装后应用程序屏幕变为空白(无法从设备获取文件夹)

问题描述

我已经构建了视频播放器,第一次安装后它工作正常,第一次安装时屏幕变黑(在允许许可后)

只有在该应用程序正常运行后允许第一次许可后才会发生这种情况..

下面是允许权限之前的屏幕截图 在此处输入图像描述

允许权限后屏幕变为空白

下面是屏幕截图 -

在此处输入图像描述

如果我重新启动应用程序,它会开始显示所有包含视频的文件夹

下面是屏幕截图(从 ram 中删除应用程序并再次打开它之后)

在此处输入图像描述

这是 HomeActivity (MainActivity) 代码的代码 -

public class HomeActivity extends AppCompatActivity {

//    ui
    RecyclerView mRecyclerView;
    TextView titleText;
    ImageView backButton;

    //var
    private static final String TAG = "HomeActivity";
    private static final int REQUEST_CODE_PERMISSION = 123;
    FolderAdapter mFolderAdapter;
    List<String> mFolderList;
    FolderViewModel mFolderViewModel;

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

        titleText = findViewById(R.id.top_folder_name);
        backButton = findViewById(R.id.back_button);
        backButton.setVisibility(View.INVISIBLE);
        mFolderViewModel = new ViewModelProvider(this, new FolderViewModelFactory(this.getApplication(),"new awesome param")).get(FolderViewModel.class);
        permission();
        Toast.makeText(this,"on create",Toast.LENGTH_SHORT).show();
        mFolderList = new ArrayList<>();
        titleText.setText("Folders");


    }

    private void subscribeObservers(){
        mFolderViewModel.getFolders().observe(this, new Observer<List<String>>() {
            @Override
            public void onChanged(List<String> Folders) {
                mFolderAdapter.setFolder(Folders);
            }
        });
    }
    private void initRecyclerView() {
        mRecyclerView = findViewById(R.id.folder_recyclerView);
        mFolderAdapter = new FolderAdapter(this);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);
        subscribeObservers();
        mRecyclerView.setAdapter(mFolderAdapter);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        Toast.makeText(HomeActivity.this,"yes",Toast.LENGTH_SHORT).show();

    }


    private void permission() {
        if(ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){

            ActivityCompat.requestPermissions(HomeActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_PERMISSION);
        }
        else{
              Toast.makeText(HomeActivity.this,"permission 1",Toast.LENGTH_SHORT).show();
                //setting observer in recyclerview
            initRecyclerView();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if(requestCode == REQUEST_CODE_PERMISSION){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Toast.makeText(HomeActivity.this, "Permission Granted 2", Toast.LENGTH_SHORT).show();
                //setting observer in recyclerview
                initRecyclerView();
            }
            else{
                ActivityCompat.requestPermissions(HomeActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_PERMISSION);
            }
        }
    }
}

我使用过 MVVM 架构。

先感谢您

标签: android

解决方案


尝试使用Dexter库来解决这个问题

这是我用来解决相同问题的代码

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

        Dexter.withContext(this)
                .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                        initRecyclerView();
                    }

                    @Override
                    public void onPermissionDenied(final PermissionDeniedResponse permissionDeniedResponse) {
                        showPermissionDeniedDialog();
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                        Toast.makeText(MainActivity.this, "App requires these permissions to run properly", Toast.LENGTH_SHORT).show();
                        permissionToken.continuePermissionRequest();
                    }
                })
                .check();

    }

这是showPermissionDeniedDialog()方法

private void showPermissionDeniedDialog() {
        final androidx.appcompat.app.AlertDialog.Builder builder =
                new androidx.appcompat.app.AlertDialog.Builder(this);
        builder.setTitle("Permission Denied");
        builder.setMessage("Please Accept Necessary Permissions");
        builder.setCancelable(true);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface imageDialog, int which) {
                imageDialog.cancel();
                startActivity(
                        new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                                .setData(Uri.fromParts("package", getPackageName(), null))
                );
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface imageDialog, int which) {
                imageDialog.cancel();
                Toast.makeText(MainActivity.this, "App requires these permissions to run properly", Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }

您现在不需要使用以前的权限请求逻辑...

这是完整的代码

public class HomeActivity extends AppCompatActivity {

        //    ui
        RecyclerView mRecyclerView;
        TextView titleText;
        ImageView backButton;

        //var
        private static final String TAG = "HomeActivity";
        private static final int REQUEST_CODE_PERMISSION = 123;
        FolderAdapter mFolderAdapter;
        List<String> mFolderList;
        FolderViewModel mFolderViewModel;

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



            titleText = findViewById(R.id.top_folder_name);
            backButton = findViewById(R.id.back_button);
            backButton.setVisibility(View.INVISIBLE);
            mFolderViewModel = new ViewModelProvider(this, new FolderViewModelFactory(this.getApplication(),"new awesome param")).get(FolderViewModel.class);


            Dexter.withContext(this)
                    .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                    .withListener(new PermissionListener() {
                        @Override
                        public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                            initRecyclerView();
                        }

                        @Override
                        public void onPermissionDenied(final PermissionDeniedResponse permissionDeniedResponse) {
                            showPermissionDeniedDialog();
                        }

                        @Override
                        public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                            Toast.makeText(MainActivity.this, "App requires these permissions to run properly", Toast.LENGTH_SHORT).show();
                            permissionToken.continuePermissionRequest();
                        }
                    })
                    .check();



            Toast.makeText(this,"on create",Toast.LENGTH_SHORT).show();
            mFolderList = new ArrayList<>();
            titleText.setText("Folders");


        }

        private void subscribeObservers(){
            mFolderViewModel.getFolders().observe(this, new Observer<List<String>>() {
                @Override
                public void onChanged(List<String> Folders) {
                    mFolderAdapter.setFolder(Folders);
                }
            });
        }
        private void initRecyclerView() {
            mRecyclerView = findViewById(R.id.folder_recyclerView);
            mFolderAdapter = new FolderAdapter(this);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);
            subscribeObservers();
            mRecyclerView.setAdapter(mFolderAdapter);
            mRecyclerView.setLayoutManager(linearLayoutManager);
            Toast.makeText(HomeActivity.this,"yes",Toast.LENGTH_SHORT).show();
        }


        private void showPermissionDeniedDialog() {
            final androidx.appcompat.app.AlertDialog.Builder builder =
                    new androidx.appcompat.app.AlertDialog.Builder(this);
            builder.setTitle("Permission Denied");
            builder.setMessage("Please Accept Necessary Permissions");
            builder.setCancelable(true);
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface imageDialog, int which) {
                    imageDialog.cancel();
                    startActivity(
                            new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                                    .setData(Uri.fromParts("package", getPackageName(), null))
                    );
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface imageDialog, int which) {
                    imageDialog.cancel();
                    Toast.makeText(MainActivity.this, "App requires these permissions to run properly", Toast.LENGTH_SHORT).show();
                }
            });
            builder.show();
        }

希望这可以帮助。随时要求澄清...


推荐阅读