2017-04-25 2 views
-1

Ich wähle Datei mit startActivityForResult, die Datei-Manager tauber öffnen, und es sollte den Pfad meiner ausgewählten Datei zurückgeben. Nachdem ich versuche, diese Datei in meinem internen Speicher zu kopieren, und ich versuche, diese Datei mit einer anderen App zu öffnen, dh ein .jpg mit Galerie, .pdf mit Acrobat öffnen ... Aber der Code funktioniert nichtSpeichern Sie eine Datei, die ich aus meinem Download auf Interner Speicher meiner App wählen, Android

Dies ist mein Code:

package com.example.francesco.pdf_viewer; 

import android.content.Context; 
import android.content.Intent; 
import android.content.IntentSender; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.CalendarContract; 
import android.provider.ContactsContract; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.util.Calendar; 
import java.net.URI; 


import static android.util.JsonToken.NULL; 
import static java.net.Proxy.Type.HTTP; 

public class MainActivity extends AppCompatActivity { 

static final int SELECT_FILE_REQUEST = 2; 
private Uri uri; 
Button clickButton; 

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

    clickButton = (Button) findViewById(R.id.clickPath); 

    clickButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      File f = new File(uri.getPath()); 
      Uri u = Uri.fromFile(f); 
      Intent filePathIntent = new Intent(Intent.ACTION_VIEW, u); 
      startActivity(filePathIntent); 
     } 
    }); 

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

      selectFile(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == SELECT_FILE_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      Uri fileUri = data.getData(); 
      //String filename = fileUri.getPath(); 
      uri = fileUri; 
      Toast.makeText(getApplicationContext(), fileUri.toString(), Toast.LENGTH_LONG).show(); 
     } 
    } 

} 


private void selectFile() { 
    Intent selectFileIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    selectFileIntent.setType("*/*"); 
    selectFileIntent.addCategory(Intent.CATEGORY_OPENABLE); 

    try { 
     startActivityForResult(Intent.createChooser(selectFileIntent, "Select a File"), SELECT_FILE_REQUEST); 

    } catch (android.content.ActivityNotFoundException e) { 
     Toast.makeText(this, "Please install a File Manager", Toast.LENGTH_SHORT).show(); 
    } 


} 


} 

Danke, Sorry für Englisch

EDIT: Die uri, dass ich von startActivityForResult bekommen, ist dies: „Inhalt :: // com. android.providers.downloads.documents/document/10 "

Aber der ursprüngliche Pfad der Datei, die ich herunterladen, ist dies: /storage/emulated/0/Download/1/android-nn.jpg

+0

Können Sie uri der ausgewählten Datei erhalten? Was sind die Fehlerprotokolle? –

+0

Der Fehler ist dies: android.os.FileUriExposedException: Datei: /// Dokument/10 ausgesetzt über App durch Intent.getData() –

+0

ich änderte die Frage –

Antwort

0

Wenn Ihre targetSdkVersion 24 oder höher, müssen wir Verwenden Sie die FileProvider-Klasse, um Zugriff auf die jeweilige Datei oder den Ordner zu gewähren, damit sie für andere Anwendungen zugänglich sind.

prüfen diese Antwort link

+0

Ich überprüfte es vorher, aber nicht in meinem Fall –

0

Ab Android N, um, um dieses Problem zu umgehen, müssen Sie die FileProvider API verwenden.

Hier sind 3 Hauptschritte.

Schritt 1: Manifest Eintrag

<manifest ...> 
    <application ...> 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="${applicationId}.provider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/provider_paths"/> 
     </provider> 
    </application> 
</manifest> 

Schritt 2: Erstellen von XML-Datei res/xml/provider_paths.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/> 
</paths> 

Schritt 3: Code ändert

File file = ...; 
Intent install = new Intent(Intent.ACTION_VIEW); 
install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
// Old Approach 
    install.setDataAndType(Uri.fromFile(file), mimeType); 
// End Old approach 
// New Approach 
    Uri apkURI = FileProvider.getUriForFile(
          context, 
          context.getApplicationContext() 
          .getPackageName() + ".provider", file); 
    install.setDataAndType(apkURI, mimeType); 
    install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
// End New Approach 
    context.startActivity(install); 

Read detailed article here über dieses Problem.

Um Datei in internen Speicher zu kopieren:

ein Verzeichnis in android internen Speicher erstellen folgenden Zeilen verwenden und sie als Zieldateiverzeichnis geben:

File directory = getDir("FileDir", Context.MODE_PRIVATE); 

Kopieren Sie die Datei von der Quelle (Download-Verzeichnis) zum Ziel (interner Speicher) unter Verwendung der unteren Funktion.

private boolean copyFile(File src,File dst)throws IOException{ 
    if(src.getAbsolutePath().toString().equals(dst.getAbsolutePath().toString())){ 

     return true; 

    }else{ 
     InputStream is=new FileInputStream(src); 
     OutputStream os=new FileOutputStream(dst); 
     byte[] buff=new byte[1024]; 
     int len; 
     while((len=is.read(buff))>0){ 
      os.write(buff,0,len); 
     } 
     is.close(); 
     os.close(); 
    } 
    return true; 
} 
+0

Dies funktioniert Code funktioniert und ich öffne richtig "Datei", aber ich möchte die Datei im Verzeichnis "Download" nehmen und es im internen Speicher meiner App kopieren –

+0

@ Francesco.DBÜberprüfe meine aktualisierte Antwort, um deine ausgewählte Datei von extern in den internen Speicher zu kopieren. –

+0

Ich versuche Ihren Code, aber die Datei .png, die ich öffnen möchte, zeigt nicht das richtige Bild, aber es zeigt ein schwarzes Bild mit dem Text "konnte das Foto nicht laden" e der Pfad ist wog –

Verwandte Themen