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>