2013-06-07 19 views
15

Jeśli ktokolwiek może pomóc, byłbym naprawdę niesamowity. Buduję aplikację, w której próbuję uzyskać dostęp do moich plików i wyświetlić je w widoku obrazu.Widok pliku z Dysku Google Android Intent

mam przycisk i że mam dołączyć 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); 
    } 
}); 

Intencją daje mi 3 opcje Gallery, Dropbox i Dysk Google

Dla Galerii jestem w stanie uzyskać dostęp LIS plików to i wyświetlić go w 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)); 

Dla Dropbox to zrobić jak ten

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

Jednak jestem pewien jak to zrobić na dysku Google I starał się zrobić to tak galerii, ale pojawia się następujący błąd

E/BitmapFactory: Nie można dekodować strumień: java.io.FileNotFoundException: /: open failed: EISDIR (Is a directory)

Każda pomoc byłaby bardzo doceniana.

+0

Odkryłem tej pory: URI zwrócony jest w formacie: 'zawartość://com.google.android.apps.docs.files/exposed_content/ [base64-encoded-bytes] '. "[base64-encoded-bytes]" jest w rzeczywistości odwrotnym łańcuchem kodowanym przez adres URL, zakodowany w linii i paszy, np. '123 ...% 3D% 3D% 0A% 3B456 ...' powinno zostać zdekodowane na '456 ... 123 ... ==' Base64-dekodowanie '456 ... 123 ... ==' 64 bajty danych, ale nie mogę zrozumieć, czym są te bajty.Oto przykład uzyskanych 64-bajtowych, które mam: http://cl.ly/3Y2C1s0v3O0Q I nie ma większego sensu w HEX: http://goo.gl/7WV9K –

+0

Czy wypróbowałeś którąkolwiek z oficjalnej dokumentacji ? https://developers.google.com/drive/integrate-android-ui – Darwind

Odpowiedz

1

Tak, to może być jak uderzenie głową o ścianę. Z powodu jakiegoś api idiosyncrasies, możesz napotkać problemy używając ACTION_GET_CONTENT. Skończyło się na tym, że rzuciłem hak, by uruchomić z tego menu kontekstowego i właśnie skorzystałem z standard integration code. Powodzenia!

1

Teraz nie możesz używać ACTION_GET_CONTENT na Dysku Google. Było ono błędnie obsługiwane przez Google w starszej wersji. Jednak najnowsza wersja Dysku (1.1.470.15) zamiary zostały wyłączone, a ACTION_GET_CONTENT nie zwróci dysku jako opcji.

Przeczytaj poniżej dyskusję dotyczącą problemu.
https://productforums.google.com/forum/#!topic/drive/siSKHXdE-ao/discussion

+2

Mam 1.2.228.32, a opcja Dysk pojawia się, gdy zaczynam intencję ACTION_GET_CONTENT. –

+0

Potem myślę, że faceci Google muszą się tym zająć. Podnieście problem w Google za to. – blganesh101

3

Poprawna odpowiedź dano pierwotnie tutaj: Google Drive GET_CONTENT intent read file

rozwiązaniem jest dostać go od contentResolver jak InputStream

Mojego pełnego kodu, aby uzyskać obraz z jakiegoś:

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

'Kursor kursor = getContentResolver(). Query (selectedImage, filePathColumn, null, null, null);' zgłasza wyjątek. To nie jest rozwiązanie. – Nizzy

+0

jaki wyjątek? To działa dla mnie ... –

+1

Roger, właśnie wypróbowałem twoje rozwiązanie i zadziałało. Poprzednio używałem ContentResolver do wysyłania zapytań do ścieżki zawartości zwróconej z GET_CONTENT ACTION, a następnie otwierania jej jako pliku, który działał dla wszystkich źródeł oprócz Dysku Google. Dzięki! –

0

Jeśli chcesz otworzyć dowolny plik pobrany z Dysku, możesz to zrobić łatwo, korzystając z zasobów aplikacji Dysk Google. Przede wszystkim zainstaluj aplikację Dysk Google z gry na rynku Install Google Drive

Następnie użyj tego kodu, aby otworzyć swój plik.

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); 

będzie wyświetlany plik dowolnego typu (zdjęcie, pdf, doc, txt itp)

Powiązane problemy