2017-02-23 147 views
2

我最近遇到了崩溃,同时在三星手机中用Android Nougat运行我的应用程序。我没有给予com.sec.android.provider.badge.BadgeProvider的运行时权限,导致崩溃。我不知道如何给这个徽章提供者提供运行时权限,如果有人知道请帮助我。权限拒绝:编写com.sec.android.provider.badge.BadgeProvider

的崩溃报告,给出以下

java.lang.SecurityException异常:权限拒绝:写作com.sec.android.provider.badge.BadgeProvider URI内容:从PID = 5325 //com.sec.badge/apps ,uid = 10242需要com.sec.android.provider.badge.permission.WRITE或grantUriPermission() at android.os.Parcel.readException(Parcel.java:1693) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils .java:183) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) at android.content.ContentProviderProxy.delete(ContentProviderNative.java:544)

回答

0

这是我用来请求运行时的多个权限的模板。您需要根据自己的需求自行修改

您还需要在清单中包含<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/><uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>

public class SplashScreen extends AppCompatActivity { 

private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
private static final int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_splash_screen); 

} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     if (hasFocus) { 
      getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
        | View.SYSTEM_UI_FLAG_FULLSCREEN 
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
     } 
    } 
} 

private boolean checkPlayServices() { 
    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if (apiAvailability.isUserResolvableError(resultCode)) { 
      apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) 
        .show(); 
     } else { 
      Log.i("Google Play", "This device is not supported."); 
     } 
     return false; 
    } 
    return true; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) { 
      // Marshmallow+ 
      askMultipleRuntimePermission(); 
    }else{ 
      //below Marshmallow 
      //do something 
    } 
} 

@TargetApi(Build.VERSION_CODES.M) 
public void askMultipleRuntimePermission(){ 
    List<String> permissionsNeeded = new ArrayList<String>(); 

    final List<String> permissionsList = new ArrayList<String>(); 
    if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION)) 
     permissionsNeeded.add("GPS"); 
    if (!addPermission(permissionsList, Manifest.permission.CAMERA)) 
     permissionsNeeded.add("Camera"); 
    if (!addPermission(permissionsList, Manifest.permission.CALL_PHONE)) 
     permissionsNeeded.add("Phone Call"); 
    if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) 
     permissionsNeeded.add("Write File"); 
    if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS)) 
     permissionsNeeded.add("Read Contacts"); 
    if (!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO)) 
     permissionsNeeded.add("Record Audio"); 


    if (permissionsList.size() > 0) { 
     if (permissionsNeeded.size() > 0) { 
      requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
      return; 
     } 
     requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
       REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
     return; 
    } 
    else{ 
     //Do something here 
    } 

} 


@TargetApi(Build.VERSION_CODES.M) 
private boolean addPermission(List<String> permissionsList, String permission) { 
    if (ActivityCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED) { 
     permissionsList.add(permission); 
     // Check for Rationale Option 
     if (!shouldShowRequestPermissionRationale(permission)) 
      return false; 
    } 
    return true; 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { 
      Map<String, Integer> perms = new HashMap<String, Integer>(); 
      // Initial 
      perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.CALL_PHONE, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED); 
      // Fill with results 
      for (int i = 0; i < permissions.length; i++) 
       perms.put(permissions[i], grantResults[i]); 
      // Check for ACCESS_FINE_LOCATION 
      if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { 
       // All Permissions Granted 
       // Do something next 
      } else { 
       // Permission Denied 
       Log.i("Permission", " some of the permission have been denied"); 
       // Alert user about permission denied, and do something 
      } 
     } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

} 
+0

好的,但我们如何在运行时实现徽章权限 –

+0

Emm,代码将为您做所有事情。你只需要删除不用的不必要的Manifest.permission.xxxx,并用'com.sec.android.provider.badge.permission.WRITE' –

+0

替换它。但是,当我尝试它时,它显示.sec上的错误,因为不能解决符号 –