android - 首次安装后应用程序屏幕变为空白(无法从设备获取文件夹)
问题描述
我已经构建了视频播放器,第一次安装后它工作正常,第一次安装时屏幕变黑(在允许许可后)
只有在该应用程序正常运行后允许第一次许可后才会发生这种情况..
允许权限后屏幕变为空白
下面是屏幕截图 -
如果我重新启动应用程序,它会开始显示所有包含视频的文件夹
下面是屏幕截图(从 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 架构。
先感谢您
解决方案
尝试使用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();
}
希望这可以帮助。随时要求澄清...
推荐阅读
- javascript - 为什么我们不需要像安装 JRE 一样安装 Node.js 来运行 Java Applet?
- reactjs - 如何有条件地在反应路由器中导入组件
- javascript - 获取 Websocket 实例 JS
- google-cloud-platform - 由于徽标需要 OAuth 同意屏幕验证,但无法删除徽标
- spring - 使用私有 git 存储库配置服务器
- php - PHP - 按修改日期排序的目录列表
- c - 使用 system() 调用的 SFTP
- r - 循环 cv.kknn - 应用错误(weightClass,1,顺序,递减 = TRUE)[1,]:维数不正确
- mysql - 用 LEFT 和 COUNT 选择 DItinct
- arrays - 突出显示重复单元格,其中另一列中的单元格也重复