本篇主要是对AndroidQ(10)分区存储适配具体实现 要点: Android Q文件存储机制修改成了沙盒模式 APP只能访问自己目录下的文件和公共媒体文件 对于AndroidQ以下,还是使用老的文件存储方式...这里需要注意:在适配AndroidQ的时候还要兼容Q系统版本以下的,使用SDK_VERSION区分 背景 存储权限 Android Q仍然使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE...APP私有目录 地址:/storage/emulated/0/Android/data/包名/files 私有目录存放app的私有文件,会随着App的卸载而删除。...parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r"); if (parcelFileDescriptor...= null && parcelFileDescriptor.getFileDescriptor() !
<provider android:name=".providers.YouNiProvider" android:process="com.snda.youni.mms" android:authorities...(file,ParcelFileDescriptor.MODE_READ_ONLY); } 这段代码使用android.net.Uri.getLastPathSegment()从paramUri中获取文件名...(file,ParcelFileDescriptor.MODE_READ_ONLY); } 这个编码后的URL: ..%2F..%2F..%2Fdata%2Fdata%2Fcom.example.android.app.../data/data/com.example.android.app/shared_prefs/Example.xml。...=0){ throw new IllegalArgumentException(); } return ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_ONLY
一句话介绍 MediaStore,MediaStore 就是Android系统中的一个多媒体数据库。...Q 以前代表了文件的路径,但在 Android Q上该路径无法被访问,因此没有意义。...{ FileOutputStream ostream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());...parcelFileDescriptor, File dst) throws IOException { FileInputStream istream = new FileInputStream...强烈呼吁 Android Q 的正式版能修正这个 API 设计缺陷。 以上就是本文的全部内容,希望对大家的学习有所帮助。
package com.android.guocheng.printdemo; import android.content.Context; import android.graphics.Bitmap...; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import...; import android.os.Bundle; import android.os.CancellationSignal; import android.os.ParcelFileDescriptor...getWidthMils() * 72 / 1000; if (cancellationSignal.isCanceled()) { callback.onLayoutCancelled(); return; } ParcelFileDescriptor...(new File(pdfPath), ParcelFileDescriptor.MODE_READ_ONLY); if (mFileDescriptor !
前言: Android不支持pdf的在线预览,网上有多种预览pdf的实现方式,点此查看总结 这里实现一种先下载pdf文件到本地,再将文件转成图片显示的的操作 一个工具类: import android.app.Application...; import android.arch.lifecycle.AndroidViewModel; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.MutableLiveData...; import android.graphics.Bitmap; import android.graphics.pdf.PdfRenderer; import android.os.ParcelFileDescriptor...; import android.support.annotation.WorkerThread; import android.util.Log; import android.widget.ImageView...(file, ParcelFileDescriptor.MODE_READ_ONLY); if (mFileDescriptor !
super.onTransact(code, data, reply, flags); } } } 别忘了让RemoteService运行在其他进程 <service android...:name=".RemoteService" android:exported="true" android:process=":remote"> 3.3 运行结果...ParcelFileDescriptor是android提供的,继承于Parcelable,可以在AIDL中直接使用。...4.1 用法 用java层File对象创建ParcelFileDescriptor public static ParcelFileDescriptor open(File file, int mode...经过Binder通信传递ParcelFileDescriptor对象。Server端拿到的fd1指向的是file2。
有了该类就可以使用onWrite方法写入制定的文件,但是这个方法需要传入回调这个悲剧的是这个回调方法是hiden的我们没办法调用 3,字怎么解决呢,有连个方法 3.1 使用此开源库替换自己的sdk 中的android.jar...PDFTest.pdf"); File dexCacheFile; // 获取需要打印的webview适配器 PrintDocumentAdapter printAdapter; PageRange[] ranges; ParcelFileDescriptor...= android.os.Build.VERSION_CODES.KITKAT) { /** * android 5.0之后,出于对动态注入字节码安全性德考虑,已经不允许随意指定字节码的保存路径了,...文件,pdfFilePath为自行指定的PDF文件路径 if (file.exists()) { file.delete(); } file.createNewFile(); descriptor = ParcelFileDescriptor.open...(file, ParcelFileDescriptor.MODE_READ_WRITE); // 设置打印参数 PrintAttributes attributes = new PrintAttributes.Builder
幸好Android在5.0后就开始支持PDF文件的读取,直接在内核中集成了PDF的渲染操作,很大程度上方便了开发者,这个内核中的PDF管理工具便是PdfRenderer。...(); 从存储卡上读取pdf文件的代码举例如下: ParcelFileDescriptor fd = ParcelFileDescriptor.open( new File("example.pdf...fd = ParcelFileDescriptor.open( new File(path), ParcelFileDescriptor.MODE_READ_ONLY); PdfRenderer...在Android的控件家族当中,比较接近上下层叠方式的是栈视图StackView,它的前后两项视图有部分是重叠在一起的,然后可以通过上下滑动来切换当前显示的顶层视图。...点击下载本文用到的层叠翻页的书籍浏览代码 点此查看Android开发笔记的完整目录
; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.MemoryFile...; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.RemoteException...通过反射获得文件句柄 FileDescriptor fd = (FileDescriptor) method.invoke(mf); ParcelFileDescriptor...pfd = ParcelFileDescriptor.dup(fd); //将文件句柄写到binder调用的返回值中。...android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import
parcelFileDescriptor = null; FileDescriptor fileDescriptor = null; Bitmap bitmap = null;...if (parcelFileDescriptor !...= null && parcelFileDescriptor.getFileDescriptor() !...= null) { fileDescriptor = parcelFileDescriptor.getFileDescriptor(); //转换uri为...= null) { parcelFileDescriptor.close(); }catch (IOException e) { } }
; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor...failed to close file"); } } return true; } @Override public ParcelFileDescriptor...; return ParcelFileDescriptor.open(file, modeBits); } @Override public String getType...; import android.net.Uri; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.view.View...ParcelFileDescriptor pfd = null; try { pfd = getContentResolver().openFileDescriptor
6)根据Uri获得Bitmap private Bitmap getBitmapFromUri(Uri uri) throws IOException { ParcelFileDescriptor...parcelFileDescriptor = getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor...(fileDescriptor); parcelFileDescriptor.close(); return image; } ?..."com.example.android.storageprovider.MyCloudProvider" android:authorities="com.example.android.storageprovider.documents..." android:grantUriPermissions="true" android:exported="true" android
$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java...:102) at android.os.Looper.loop(Looper.java:145) at android.os.HandlerThread.run(HandlerThread.java...@Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {...; if (mode.equalsIgnoreCase("rw")) m = ParcelFileDescriptor.MODE_READ_WRITE; File f =...new File(uri.getPath()); ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, m); return
在Android7.0,Android提高了应用的隐私权,限制了在应用间共享文件。如果需要在应用间共享,需要授予要访问的URI临时访问权限。...#openFileDescriptor(Uri, String) ContentResolver.openFileDescriptor} to get a {@link ParcelFileDescriptor...} 也就是openFileDescriptor方法,拿到ParcelFileDescriptor类型数据,其实就是一个文件描述符,然后就可以读取文件流了。...ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(intent.getData(),..."r"); FileReader reader = new FileReader(parcelFileDescriptor.getFileDescriptor()); BufferedReader bufferedReader
#openFileDescriptor(Uri, String) ContentResolver.openFileDescriptor} to get a {@link ParcelFileDescriptor...} 也就是openFileDescriptor方法,拿到ParcelFileDescriptor类型数据,其实就是一个文件描述符,然后就可以读取文件流了。...ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(intent.getData(),..."r"); FileReader reader = new FileReader(parcelFileDescriptor.getFileDescriptor()); BufferedReader bufferedReader...& NDK Android 中的网络访问 Intent Fragment Android 高级(★★★) Android 性能优化 Android 屏幕适配 AIDL 自定义控件 Android 中的事件处理
= null var parcelfd : ParcelFileDescriptor? = null var mBitmap : Bitmap?...(file,ParcelFileDescriptor.MODE_READ_ONLY) btn_prev.setOnClickListener { renderPrev() }...注意的是 PdfRenderer 构造方法接受的参数是一个 ParcelFileDescriptor 对象。...所以,我们要将 pdf 路径创建的 File 对象转换成 ParcelFileDescriptor。...parcelfd = ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_ONLY) 整个 Activity 最核心的方法是 renderPage
; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.ParcelFileDescriptor...albumid < 0) { Uri uri = Uri.parse("content://media/external/audio/media/" + songid + "/albumart"); ParcelFileDescriptor...BitmapFactory.decodeFileDescriptor(fd); } } else { Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid); ParcelFileDescriptor...相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android视图View技巧总结》、《Android编程之activity...操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》 希望本文所述对大家Android程序设计有所帮助。
void handleGalleryKitKatResult(int resultCode, Intent data) { File faceFile; try { ParcelFileDescriptor...parcelFileDescriptor = getContentResolver().openFileDescriptor(contentUri, "r");...FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor...) 第一步 在manifest文件中加入FileProvider: <manifest xmlns:android="http://schemas.android.com/apk/res/android...android:name="android.support.FILE_PROVIDER_PATHS" android:resource=
但是如果代码写得不严谨,就可能会出现路径穿越等问题,一个经典的漏洞实现如下: @Override public ParcelFileDescriptor openFile(Uri uri, String...(file, ParcelFileDescriptor.MODE_READ_ONLY); } throw new FileNotFoundException(uri.getPath())...(f, ParcelFileDescriptor.MODE_READ_ONLY); } 这里想用 getLastPathSegment 去只获取最后一级的文件名,但实际上可以被 URL encode 的路径绕过...正确的防御和过滤方式如下: public ParcelFileDescriptor openFile (Uri uri, String mode) throws FileNotFoundException...(mode); return ParcelFileDescriptor.open(new File(path), modeBits); } 这个方法的主要作用是方便子类用于快速实现 openFile
> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical... android.net.Uri; import android.os.ParcelFileDescriptor; import android.provider.BaseColumns; ...Bitmap makeBitmap(int minSideLength, int maxNumOfPixels, Uri uri, ContentResolver cr, ParcelFileDescriptor... closeSilently(pfd); } return b; } private static void closeSilently(ParcelFileDescriptor... c.close(); } catch (Throwable t) { // do nothing } } private static ParcelFileDescriptor
领取专属 10元无门槛券
手把手带您无忧上云