浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【java】Oreo以上のバージョンでキャッシュ上に保存したファイルパスを取得する

android8.0以降ではファイルパスの取得法が変わっており、

kitkat以降で使われていたgetContentResolverではファイルパスが

正確に取得できなくなっていました。

OreoとかpieでファイルパスをSQLiteに保存する場合はアプリ内ストレージにキャッシュしたファイル

のパスを保存して、更にOutputStreamでStringに書きだす必要があります。

今回はFileOutputStreamで書き込まれるファイル、InputStreamで

Stringのファイルパスが返ってきたら後はそれをSQLiteのカラムに保存するだけ。

画像の保管場所はgetCacheDir()で内部ストレージにしてあります。

@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent intent) {
try {
Uri contactUri = intent.getData();
final String docId = DocumentsContract.getDocumentId(contactUri);
InputStream inputStream = getContentResolver().openInputStream(contactUri);</pre>
File file = new File(getCacheDir().getAbsolutePath()+"/"+docId);
System.out.println(file);
writeFile(inputStream, file);
String filePath = file.getAbsolutePath();
System.out.println(filePath);

} catch (Exception e) {
}
}
public void writeFile(InputStream in, File file) {
OutputStream out = null;
try {
out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if ( out != null ) {
out.close();
}
in.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
<pre>

なお、5以下のosではこちらで問題なく取得することができます。

</pre>
Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,null);
<pre>
  • この記事いいね! (0)