it-swarm.com.de

Rufen Sie das Bild nach dem Herunterladen aus der Google Foto-Bibliothek ab

Ich habe die Absicht, Fotos aus der Galerie abzurufen, und wenn ich die Nexus-Google-Foto-App in meiner Galerie verwende, funktioniert alles einwandfrei.

Wenn das Bild jedoch nicht auf dem Telefon (im Google Photos-Onlinedienst) gespeichert ist, wird es für mich heruntergeladen. Nachdem ich das Bild ausgewählt habe, sende ich es zum Zuschneiden an eine andere Aktivität. Beim Herunterladen ist das an die Zuschneideaktivität gesendete Bild jedoch null, da der Download noch nicht abgeschlossen ist.

Woher weiß ich, wann der Download abgeschlossen ist, um das Bild an die Zuschneideaktivität zu senden?

Hier ist mein Code:

private void pickFromGallery()
{
    Intent galleryIntent = new Intent(Intent.ACTION_PICK,Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        // When an Image is picked
        if (requestCode == RESULT_LOAD_IMG && resultCode == Activity.RESULT_OK
                && null != data) {
            // Get the Image from data

            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            // Get the cursor
            Cursor cursor = getApplicationContext().getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            // Move to first row
            assert cursor != null;
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imgDecodableString = cursor.getString(columnIndex);
            cursor.close();
            startCrop(imgDecodableString);
        }
    } catch (Exception e) {
        Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                .show();
    }
    }

jede Hilfe wäre dankbar.

12
Mostafa Addam

Ich denke, Sie können keine Bilder zuschneiden, wenn Sie ein ausgewähltes Bild von Google Fotos herunterladen. Sie können nur Ihre lokalen Speicherbilder zuschneiden

Um jedoch zu überprüfen, ob das ausgewählte Bild heruntergeladen werden kann oder aus dem lokalen Speicher stammt, können Sie dies in Ihrer onActivityResult() -Methode tun.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_LOAD_IMG && resultCode == Activity.RESULT_OK
                && null != data) {

                Uri selectedImageUri = data.getData();
                String tempPath = getPath(selectedImageUri, getActivity());
                String url = data.getData().toString();
                if (url.startsWith("content://com.google.Android.apps.photos.content")){
                    try {
                        InputStream is = getActivity().getContentResolver().openInputStream(selectedImageUri);
                        if (is != null) {
                            Bitmap pictureBitmap = BitmapFactory.decodeStream(is);
                            //You can use this bitmap according to your purpose or Set bitmap to imageview
                        }
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }else {
                     startCrop(tempPath);

             }
         }

}

Hier ist die Methode getPath(), die in onActivityResult() verwendet wird.

public String getPath(Uri uri, Activity activity) {
    Cursor cursor = null;
    try {
        String[] projection = {MediaStore.MediaColumns.DATA};
        cursor = activity.getContentResolver().query(uri, projection, null, null, null);
        if (cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
            return cursor.getString(column_index);
        }
    } catch (Exception e) {
    } finally {
        cursor.close();
    }
    return "";
}

Ich hoffe es hilft dir.

14
Rajesh

Sie können keine Bilder von Google Drive herunterladen. Gehen Sie wie folgt vor, um Bilder oder Dateien von Drive herunterzuladen.

Zum Herunterladen von Bildern oder Dateien von Google Drive benötigen Sie eine Bibliothek

  • google-api-services-drive-v2-rev9-1.8.0-beta.jar ()

KONSOLE EINRICHTEN

  • weiter zu Google Consol

  • Mach ein neues Projekt. Unter Dienste müssen Sie zwei Dinge aktivieren: DRIVE API und DRIVE SDK! Sie sind getrennt, eine schaltet die andere nicht automatisch ein und Sie müssen beide einschalten! (Es hat mindestens 20 Stunden meiner Zeit gekostet, das herauszufinden.)

  • Wechseln Sie in der Konsole zu API Access. Erstellen Sie einen Client und machen Sie ihn zu einer Android-App. Gib ihm deine Bündel-ID. Ich denke nicht, dass die Fingerabdrucksache wirklich wichtig ist, da ich ziemlich sicher bin, dass ich den falschen verwendet habe, aber versuche, das trotzdem richtig zu machen (Google stellt Anweisungen dafür bereit.)

  • Es wird eine Client ID generiert. Das wirst du brauchen. Halten Sie daran fest.

DER Android CODE - Einrichten und Hochladen

  • Holen Sie sich zuerst ein Authentifizierungs-Token:

    AccountManager am = AccountManager.get (Aktivität); am.getAuthToken (am.getAccounts ()) [0], "oauth2:" + DriveScopes.DRIVE, new Bundle (), true, new OnTokenAcquired (), null);

Als nächstes muss OnTokenAcquired () so eingerichtet werden:

private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        try {
            final String token = result.getResult().getString(AccountManager.KEY_AUTHTOKEN);
            HttpTransport httpTransport = new NetHttpTransport();
            JacksonFactory jsonFactory = new JacksonFactory();
            Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
            b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
                @Override
                public void initialize(JSonHttpRequest request) throws IOException {
                    DriveRequest driveRequest = (DriveRequest) request;
                    driveRequest.setPrettyPrint(true);
                    driveRequest.setKey(CLIENT ID YOU GOT WHEN SETTING UP THE CONSOLE BEFORE YOU STARTED CODING)
                    driveRequest.setOauthToken(token);
                }
            });

            final Drive drive = b.build();

            final com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
            body.setTitle("My Test File");
    body.setDescription("A Test File");
    body.setMimeType("text/plain");

            final FileContent mediaContent = new FileContent("text/plain", an ordinary Java.io.File you'd like to upload. Make it using a FileWriter or something, that's really outside the scope of this answer.)
            new Thread(new Runnable() {
                public void run() {
                    try {
                        com.google.api.services.drive.model.File file = drive.files().insert(body, mediaContent).execute();
                        alreadyTriedAgain = false; // Global boolean to make sure you don't repeatedly try too many times when the server is down or your code is faulty... they'll block requests until the next day if you make 10 bad requests, I found.
                    } catch (IOException e) {
                        if (!alreadyTriedAgain) {
                            alreadyTriedAgain = true;
                            AccountManager am = AccountManager.get(activity);
                            am.invalidateAuthToken(am.getAccounts()[0].type, null); // Requires the permissions MANAGE_ACCOUNTS & USE_CREDENTIALS in the Manifest
                            am.getAuthToken (same as before...)
                        } else {
                            // Give up. Crash or log an error or whatever you want.
                        }
                    }
                }
            }).start();
            Intent launch = (Intent)result.getResult().get(AccountManager.KEY_INTENT);
            if (launch != null) {
                startActivityForResult(launch, 3025);
                return; // Not sure why... I wrote it here for some reason. Might not actually be necessary.
            }
        } catch (OperationCanceledException e) {
            // Handle it...
        } catch (AuthenticatorException e) {
            // Handle it...
        } catch (IOException e) {
            // Handle it...
        }
    }
}

DER Android CODE - Herunterladen

private Java.io.File downloadGFileToJFolder(Drive drive, String token, File gFile, Java.io.File jFolder) throws IOException {
    if (gFile.getDownloadUrl() != null && gFile.getDownloadUrl().length() > 0 ) {
        if (jFolder == null) {
            jFolder = Environment.getExternalStorageDirectory();
            jFolder.mkdirs();
        }
        try {

            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(gFile.getDownloadUrl());
            get.setHeader("Authorization", "Bearer " + token);
            HttpResponse response = client.execute(get);

            InputStream inputStream = response.getEntity().getContent();
            jFolder.mkdirs();
            Java.io.File jFile = new Java.io.File(jFolder.getAbsolutePath() + "/" + getGFileName(gFile)); // getGFileName() is my own method... it just grabs originalFilename if it exists or title if it doesn't.
            FileOutputStream fileStream = new FileOutputStream(jFile);
            byte buffer[] = new byte[1024];
            int length;
            while ((length=inputStream.read(buffer))>0) {
                fileStream.write(buffer, 0, length);
            }
            fileStream.close();
            inputStream.close();
            return jFile;
        } catch (IOException e) {        
            // Handle IOExceptions here...
            return null;
        }
    } else {
        // Handle the case where the file on Google Drive has no length here.
        return null;
    }
}
2
vishal jangid

Sie können AsyncTask zum Herunterladen (oder Kopieren lokaler Bilder) und dann zum Verarbeiten verwenden.

In Ihrer Aktivität erstellen Sie:

private class PictureAsyncTask extends AsyncTask<Void, Void, String> {
    private Uri mUri;

    public PictureAsyncTask(Uri uri) {
        mUri = uri;
    }

    @Override
    protected String doInBackground(Void... params) {
        InputStream inputStream = null;
        try {
            inputStream = getContentResolver().openInputStream(mUri);
            String path = null; // Path of downloaded image
            // Download image from inputStream
            return path;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null
    }

    @Override
    protected void onPostExecute(String path) {
        if (path == null) {
            // Process image
            // Maybe another AsyncTask or background thread?
        } else {
            // Download failed
        }
    }
}

Rufen Sie es von onActivityResult auf:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case RESULT_LOAD_IMG:
            if (resultCode == RESULT_OK) {
                if (data != null) {
                    Uri uri = data.getData();
                    if (uri != null) {
                        new PictureAsyncTask(uri).execute();
                    } else {
                        // No data
                    }
                } else {
                    // No picture selected?
                }
            }
            break;
    }
}
0
Milos Fec