2017-06-13 87 views
0

我试图制作一个使用DownloadManager下载iCal文件的应用程序。经过一番调查,我找不到解决我的问题。使用Android Studio调试器时,发现应用程序在查询请求时崩溃。在这里,我的错误中得到了Android监视器:当将请求排入DownloadManager时,应用程序崩溃

java.lang.SecurityException: Permission Denial: writing com.android.providers.downloads.DownloadProvider uri content://downloads/my_downloads from pid=5082, uid=10208 requires android.permission.INTERNET, or grantUriPermission() 

我不明白为什么需要这已经给出android.permission.INTERNET,下面我AndroidManifest所示:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="galisson.esiea.pst3.smartwatch"> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/smartwatch" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 


</application> 

这里是我的MainActivity

public class MainActivity extends AppCompatActivity { 

    EditText url; 
    Button buttonAdd; 

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

     url = (EditText) findViewById(R.id.editTextLink); 
     buttonAdd = (Button) findViewById(R.id.buttonADD); 

     buttonAdd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!url.getText().toString().isEmpty()) { 
        Uri iCalURI = Uri.parse(url.getText().toString()); 

        DownloadData(iCalURI); 

       } 
      } 
     }); 


    } 

    private void DownloadData(Uri p_uri) { 

     DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
     DownloadManager.Request request = new DownloadManager.Request(p_uri); 

     request.setDescription("iCal Calendar downloading"); 
     request.setTitle("iCal calendar"); 
     request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);      //Restrict the types of networks over which this download may proceed. 
     request.setAllowedOverRoaming(false);                        //Set whether this download may proceed over a roaming connection. 
     request.allowScanningByMediaScanner(); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
     request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "iCal_tmp.ics"); 

     manager.enqueue(request);   //this is where it crashes 

     return; 
    } 
    } 

是我的问题有权限或请求本身?

+0

请编辑您的问题并发布整个清单,以防您将这些元素放在错误的地方。它也可能是一个错误,报告错误的错误,因为通常你需要保存'WRITE_EXTERNAL_STORAGE'来写入你正在寻找的目录,并且你没有任何运行时权限代码来向用户请求'WRITE_EXTERNAL_STORAGE'。 – CommonsWare

+0

如果您正在测试棉花糖或牛轧糖应用程序,这很正常。您应该在“活动”中授予权限。 – JavadKhan

+0

@CommonsWare我已经编辑了整个清单文章 –

回答

0

首先授予您需要的权限。

public boolean isStoragePermissionGranted() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      Log.v(TAG, "Permission is granted"); 

      writeFilesToSdCard(); 
      return true; 
     } else { 

      Log.v(TAG, "Permission is revoked"); 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      return false; 
     } 
    } else { //permission is automatically granted on sdk<23 upon installation 
     writeFilesToSdCard(); 
     return true; 
    } 
} 

然后用override方法请求它。

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     Log.v(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]); 
     //resume tasks needing this permission 
    } 
} 

注意:不要忘记把权限清单之外<application>标签。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myproject"> 

    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     // 
    </application> 

</manifest> 
+0

非常感谢,它确实解决了我的问题! –

+0

@VictorGalisson欢迎您! – JavadKhan

相关问题