mary mary - 8 months ago 54
Android Question

Android 6: error file could not be accessed

I'm going crazy with a problem with Android 6. The downloads a pdf file from a Server (running in localhost. The Server Response is HTTP 200 (so no problem found), but when I try to open the file a got the error: "error file could not be accessed"

This is the Asynctack which download file:

private class DownloadContent extends AsyncTask<String,Integer,String> {
private Context context;
private PowerManager.WakeLock mWakeLock;
private String ris;

public DownloadContent(Context context) {
this.context = context;
}

@Override
protected String doInBackground(String... params) {
String nomefile=params[0];
String email=params[1];
String id=params[2];
InputStream input = null;
String[] saveFiles;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL("http://192.168.1.8:8080/com.appcampus/rest/content/"+nomefile+"/"+email+"/"+id);

connection = (HttpURLConnection) url.openConnection();
connection.connect();

if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return "Server returned HTTP " + connection.getResponseCode()
+ " " + connection.getResponseMessage();
}

int fileLength = connection.getContentLength();

// download the file
java.io.File xmlFile = new java.io.File(Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ "/"+nomefile);
input = connection.getInputStream();
int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permissionCheck == PackageManager.PERMISSION_GRANTED){


output = new FileOutputStream(xmlFile);
byte data[] = new byte[4096];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled()) {
input.close();
return null;
}
total += count;
// publishing the progress....
if (fileLength > 0) // only if total length is known
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);

}
}else{
Log.d("Permission check",""+permissionCheck);
}

saveFiles = context.fileList();
String s = "";
for (String element : saveFiles) {
s += " " + element;
}

ris = "Server returned HTTP " + connection.getResponseCode();
} catch (Exception e) {
return e.toString();
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
}

if (connection != null)
connection.disconnect();
}
return ris;
}
}


I try to open the PdfFile in the onCreate method:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

String risultato = "";
Uri path = null;
try {
path = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS ),"SisDisQuestion.pdf"));

} catch (Exception e) {
e.printStackTrace();
}
DownloadContent downloadTask = new DownloadContent(MainActivity.this);
try {

Log.d("DOWNOALD","Sono entrato in download content");
String[] param = {"SisDisQuestion.pdf","a","91"};
risultato = downloadTask.execute(param).get();
Log.d("DOWNLOAD", risultato);
Snackbar.make(view, risultato, Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
// Intent i = new Intent(SingleContentActivity.this, Main2Activity.class);
//startActivity(i);

} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}


// if(risultato.equals("HTTP 200")){
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(pdfIntent);

// }

}
});
}


And I think all the permission in the manifest are ok:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<!-- To retrieve the account name (email) as part of sign-in: -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

Answer Source

Finally I found the solution: I added file:/// in the path of the file I want to open.

Uri path = Uri.parse("file:///"+Environment
                    .getExternalStorageDirectory().toString()
                    + "/YOURFILE.pdf");