2017-04-19 20 views
3

私は外部アプリで写真を選択できるアプリを持っています。それから私は、uriから写真のパスを取って、内部的な操作のためにそれを使います。GoogleフォトアプリからUriへのパスを取得する

Googleフォトで写真を選択すると、写真がローカルに保存されている場合、次のコードは完全に機能します。しかし、画像が雲の中にある場合、の結果はcursor.getString(index)です。

私はいくつかの情報を検索しましたが、

final String[] projection = { "_data" }; 
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); 

if (cursor != null && cursor.moveToFirst()) { 
    final int index = cursor.getColumnIndexOrThrow("_data"); 
    return cursor.getString(index); 
} 

ありがとう解決がわかりません!

+0

本の複製のようになります。ここでは

はsimplificatedコードはありますか? http://stackoverflow.com/questions/30527045/choosing-photo-using-new-google-photos-app-is-broken –

+0

@ user2765258私はその投稿を見ました。しかし、良い解決策ではありません。ユーザーも、問題を解決するためにそれを受け入れたが、彼が実装した完全な解決策ではないと言った。とにかくありがとうございます – adalPaRi

答えて

3

最後に、この問題に関する@CommonsWareの回答と以前の投稿によれば、私はuriからInputStreamを取得し、新しい一時ファイルに対処し、使用する必要のある関数にパスを渡して解決しました。

public String getImagePathFromInputStreamUri(Uri uri) { 
    InputStream inputStream = null; 
    String filePath = null; 

    if (uri.getAuthority() != null) { 
     try { 
      inputStream = getContentResolver().openInputStream(uri); // context needed 
      File photoFile = createTemporalFileFrom(inputStream); 

      filePath = photoFile.getPath(); 

     } catch (FileNotFoundException e) { 
      // log 
     } catch (IOException e) { 
      // log 
     }finally { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    return filePath; 
} 

private File createTemporalFileFrom(InputStream inputStream) throws IOException { 
    File targetFile = null; 

    if (inputStream != null) { 
     int read; 
     byte[] buffer = new byte[8 * 1024]; 

     targetFile = createTemporalFile(); 
     OutputStream outputStream = new FileOutputStream(targetFile); 

     while ((read = inputStream.read(buffer)) != -1) { 
      outputStream.write(buffer, 0, read); 
     } 
     outputStream.flush(); 

     try { 
      outputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    return targetFile; 
} 

private File createTemporalFile() { 
    return new File(getExternalCacheDir(), "tempFile.jpg"); // context needed 
} 
1

Googleフォトで写真を選択すると、写真がローカルに保存されている場合、次のコードは完全に機能します。

必ずしもそうである必要はありません。 Uri_dataの列でquery()に応答する必要はありません。返される値(たとえば、アクセスできない内部ストレージやリムーバブルストレージなどのファイル)は、ユーザーにとって便利なものである必要はありません。

ImageViewに写真をロードする必要がある場合は、Urian image-loading library(ピカソなど)に渡します。

あなたは写真のバイトが必要な場合は、Uriによって識別されるコンテンツにInputStreamを取得するためにContentResolveropenInputStream()を使用しています。バックグラウンドスレッドでInputStreamを開いて読んでください。

+0

ありがとうございますが、事は私が内部要求のために実際の経路が必要であるということです。私はイメージを表示したり操作したりするつもりはなく、すでに実装されているバックエンドサービスにそのパスを渡すだけです。 – adalPaRi

+2

@adalPaRi:「実際のパス」はありません。ファイルが必要な場合は、 'OpenInputStream()'の 'InputStream'を' FileOutputStream'でコントロールしているファイルにコピーして、写真のコピーを作ることもできます。 – CommonsWare

関連する問題