2013-06-07 9 views
15

Wenn jemand helfen kann, wäre ich wirklich genial. Ich baue eine App, in der ich versuche, auf meine Dateien zuzugreifen und sie in einer Bildansicht anzuzeigen.Datei Ansicht von Google Drive Android Intent

Ich habe einen Knopf und dem messe ich ein OnClickListener

iButton.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View view) { 
    Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    photoPickerIntent.setType("image/*"); 
    startActivityForResult(Intent.createChooser(photoPickerIntent, "Select Picture"), 1); 
    } 
}); 

Die Absicht gibt mir drei Optionen Galerie, Dropbox und Google Drive

Für die Galerie ich in der Lage bin, die Datei lis für den Zugriff auf diese und zeigt es in der Imageview

Uri selectedImage = data.getData(); 
String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
cursor.moveToFirst(); 
int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
String picturePath = cursor.getString(columnIndex); 
cursor.close(); 
imageHolder.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 

Für Dropbox ich mache es wie dieses

imageHolder.setImageBitmap(BitmapFactory.decodeFile(selectedImage.getPath())); 

Allerdings bin ich nicht sicher, wie es für Google-Laufwerk zu tun, habe ich versucht, es wie die Galerie zu tun, aber ich bekomme die folgenden Fehler

E/BitmapFactory: Nicht imstande, Strom zu entschlüsseln: java.io.FileNotFoundException: /: Öffnen fehlgeschlagen: EISDIR (Ist ein Verzeichnis)

Jede Hilfe wäre sehr willkommen.

+0

Was Anzeige entdeckte ich so weit: die Uri zurück im Format lautet: 'Inhalt://com.google.android.apps.docs.files/exposed_content/ [base64-codierte-bytes] '. '[base64-encoded-bytes]' ist in Wirklichkeit eine umgekehrte Zeile-Feed-Semikolon-getrennte URL-codierte Zeichenfolge, z. '123 ...% 3D% 3D% 0A% 3B456 ...' sollte in '456 ... 123 definiert werden ... ==' Base64-Decodierung '456 ... 123 ... ==' ergibt 64 Bytes Daten, aber ich kann nicht verstehen, was diese Bytes sind.Hier ist ein Beispiel für die resultierenden 64-Bytes, die ich bekam: http://cl.ly/3Y2C1s0v3O0Q Und es macht keinen Sinn in HEX: http://goo.gl/7WV9K –

+0

Haben Sie eine der offiziellen Dokumentation versucht ? https://developers.google.com/drive/integrate-android-ui – Darwind

Antwort

1

Ja, das kann sein, als würde man seinen Kopf gegen eine Wand schlagen. Aufgrund einiger Laufwerksseiten api idiosyncrasies könnten Sie Probleme mit ACTION_GET_CONTENT bekommen. Ich landete einen Hack zum Starten von diesem Kontextmenü und nur die standard integration code verwendet. Viel Glück!

1

Derzeit können Sie ACTION_GET_CONTENT nicht in Google Drive verwenden. Es wurde fälschlicherweise von Google in der älteren Version unterstützt. Aber die neueste Version von Drive (1.1.470.15) hat die Absichten deaktiviert und ACTION_GET_CONTENT wird Laufwerk nicht als eine Option werfen.

Lesen Sie unten die Problemdiskussion.
https://productforums.google.com/forum/#!topic/drive/siSKHXdE-ao/discussion

+2

Ich habe 1.2.228.32 und die Option Laufwerk wird angezeigt, wenn ich eine ACTION_GET_CONTENT Intent starte. –

+0

Dann denke ich, Google Jungs müssen sich darum kümmern. Erhebe dafür ein Problem bei Google. – blganesh101

3

richtige Antwort war ursprünglich hier gegeben: Google Drive GET_CONTENT intent read file

Lösung ist es von contentResolver zu erhalten, wie InputStream

Meine vollständigen Code-Bild zu erhalten von was auch immer:

Uri selectedImage = imageReturnedIntent.getData(); 
if (selectedImage == null) { 
    return; 
} 
String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
if (cursor != null && cursor.moveToFirst()) { 
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    mCurrentPhotoPath = cursor.getString(columnIndex); 
    cursor.close(); 
} 

if (TextUtils.isEmpty(mCurrentPhotoPath)) { 
    mCurrentPhotoPath = selectedImage.getPath(); 
} 
Bitmap bitmap = null; 
if (imageReturnedIntent.getDataString() != null && imageReturnedIntent.getDataString().contains("docs.file")) { 
    try { 
     InputStream inputStream = getContentResolver().openInputStream(selectedImage); 
     bitmap = BitmapFactory.decodeStream(inputStream); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

if (bitmap == null) { 
    bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath); 
} 
+2

'Cursorcursor = getContentResolver(). Query (selectedImage, DateiPfadSpalte, null, null, null);' löst Ausnahme aus. Dies ist nicht die Lösung. – Nizzy

+0

welche Ausnahme? Es funktioniert für mich ... –

+1

Roger, ich habe gerade deine Lösung ausprobiert und es hat funktioniert. Ich hatte zuvor mit dem ContentResolver den Dateipfad des von GET_CONTENT ACTION zurückgegebenen Inhalts abgefragt und dann als Datei geöffnet, was für alle Quellen außer Google Drive funktionierte. Vielen Dank! –

0

Wenn Sie Wenn Sie eine Datei öffnen möchten, die Sie von Google Drive abgerufen haben, können Sie dies problemlos mit den Ressourcen der Google Drive App tun. Zunächst installieren Sie die Google Drive App aus dem Play-Markt Install Google Drive

Danach verwenden Sie diesen Code, um Ihre Datei zu öffnen.

FileID=file.getId();//it is your file ID which you want to display 

    String url = "https://docs.google.com/file/d/"+FileID; 
    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.setData(Uri.parse(url)); 
    startActivity(i); 

Es wird Ihre Datei beliebigen Typs (Bild, pdf, doc, txt etc.)

Verwandte Themen