web-dev-qa-db-ja.com

ダウンロード後にグーグルフォトライブラリから画像を取得する

ギャラリーから写真を取得するインテントを開始しています。ギャラリーでnexusgoogle photoアプリを使用している場合、すべてが正常に機能します。

ただし、画像が電話(Googleフォトオンラインサービス)にない場合は、ダウンロードされます。画像を選択した後、画像をトリミングのために別のアクティビティに送信していますが、ダウンロードの場合、ダウンロードがまだ完了していないため、トリミングアクティビティに送信された画像はnullになります。

ダウンロードが終了したことを確認して、画像をトリミングアクティビティに送信するにはどうすればよいですか?

これが私のコードです:

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

どんな助けでもいただければ幸いです。

13
Mostafa Addam

グーグルフォトから選択した画像をダウンロードすると、画像を切り抜くことができないと思います。ローカルストレージイメージのみをトリミングできます

ただし、選択した画像がダウンロード可能かローカルストレージからかを確認するには、onActivityResult()メソッドでこのように行うことができます。

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

             }
         }

}
_

これがgetPath()で使用されるonActivityResult()メソッドです。

_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 "";
}
_

お役に立てば幸いです。

15
Rajesh

Googleドライブから画像をダウンロードすることはできません以下はドライブから画像またはファイルをダウンロードする手順です。

グーグルドライブから画像やファイルをダウンロードするには、ライブラリが必要です

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

コンソールのセットアップ

  • 次に行く Google Consol

  • 新しいプロジェクトを作成します。 [サービス]で、[DRIVEAPI]と[DRIVESDK]の2つをオンにする必要があります。それらは別々であり、一方が自動的に他方をオンにすることはありません。両方をオンにする必要があります。 (これを理解することは、私の時間の少なくとも20時間を無駄にしました。)

  • 引き続きコンソールで、APIAccessに移動します。クライアントを作成し、それをAndroidアプリにします。バンドルIDを指定します。間違ったものを使用したと確信しているので、指紋のことは実際には重要ではないと思いますが、とにかくそれを正しくするようにしてください(Googleはそれについての指示を提供します)。

  • クライアントIDを生成します。あなたはそれを必要とするでしょう。それを握りなさい。

THE Android CODE-セットアップとアップロード

  • まず、認証トークンを取得します。

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

次に、OnTokenAcquired()を次のように設定する必要があります:

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...
        }
    }
}

THE Androidコード-ダウンロード

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

AsyncTaskを使用してダウンロード(またはローカルイメージのコピー)を行い、それを処理できます。

アクティビティで以下を作成します。

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
        }
    }
}

OnActivityResultから呼び出します。

@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