首页 > 解决方案 > Android Loss 对 Service 的写入权限

问题描述

我浏览了很多试图找到答案,我正在尝试通过 Android 服务下载文件,我确实检查并授予 MainActivity 权限,并验证它是否已被授予。当我进入服务类时,应用程序只会被拒绝权限。

这是代码:

public class MainActivity extends AppCompatActivity  implements EasyPermissions.PermissionCallbacks{

private static final int WRITE_REQUEST_CODE = 300;

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

    final TextView text = findViewById(R.id.text);
    text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (text.getText().toString().equals("Started")) {
                text.setText("Stoped");
                stopService(new Intent(MainActivity.this,DownloadService.class));
            } else {
                text.setText("Started");

                startService(new Intent(MainActivity.this,DownloadService.class));
            }
        }
    });

    EasyPermissions.requestPermissions(this, getString(R.string.write_file), WRITE_REQUEST_CODE, Manifest.permission.READ_EXTERNAL_STORAGE);

    if (EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText(getApplicationContext(), "Permission Granted", Toast.LENGTH_SHORT).show();
    }

    /*  MARKED CODE
DownloadFile downloadFile;
        downloadFile = new DownloadFile(getApplicationContext());
        downloadFile.execute("<https link>");*/
    }

@Override
public void onBackPressed() {

    moveTaskToBack (true);

    Toast.makeText(getApplicationContext(), "Move to Back", Toast.LENGTH_SHORT).show();
}

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

@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
    Log.d("app", "Permission has been granted");
    Toast.makeText(getApplicationContext(), "Permission has been granted", Toast.LENGTH_SHORT).show();
}

@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
    Log.d("app", "Permission has been denied");
    Toast.makeText(getApplicationContext(), "Permission has been denied", Toast.LENGTH_SHORT).show();
    }
}

服务等级(仅相关部分):

public class DownloadService extends Service {

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

 if (!EasyPermissions.hasPermissions(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                                    Toast.makeText(getApplicationContext(), "Permission Lost", Toast.LENGTH_SHORT).show();
                                }
                                // download file and get it's locat path
                                String msg = downloadFile.downloadFile(imagePATH);
}

主要活动确实没有服务权限!DownloadFile 是一个简单的类。

一些奇怪的行为,如果我在将 DownloadFile 更改为 AsyncTask 时执行 MARKD CODE,我确实设法下载和存储文件。与我切换回原始代码相比,服务还可以将文件写入存储。

这是怎么回事?

标签: androidservicedownloadpermissionsstorage

解决方案


推荐阅读