blob: a4d97796aaa36f14b5742843f3b8901a6d670b0e [file] [log] [blame]
page.title=Truy cp Thư mc theo Phm vi
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#accessing">Truy cp mt Thư mc lưu tr bên ngoài</a></li>
<li><a href="#removable">Truy cp mt Thư mc trên Phương tin tháo lp được</a></li>
<li><a href="#best">Thc hành Tt nht</a></li>
</ol>
</div>
</div>
<p>Các ng dng như ng dng nh thường ch cn truy cp đến các thư mc đã quy định trong
b nh ngoài như thư mc <code>Pictures</code>. Các phương pháp
hin ti để truy cp b nh lưu tr ngoài vn chưa được thiết kế để d dàng cho phép
truy cp thư mc đích cho nhng kiu ng dng này. Ví dụ:</p>
<ul>
<li>Vic yêu cu {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
hoc {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} trong bản kê khai của bạn
s cho phép truy cp đến tt c các thư mc công khai trên b nh lưu tr ngoài, mà có th
cp nhiu quyn truy cp hơn nhng gì ng dng ca bn cn.</li>
<li>S dng
<a href="{@docRoot}guide/topics/providers/document-provider.html">Khuôn kh
Truy cp Kho lưu trữ</a> thường khiến người dùng chn thư mc
thông qua UI h thng. Đây là điu không cn thiết nếu ng dng ca bn luôn truy cp cùng
mt thư mc bên ngoài.</li>
</ul>
<p>Android N cung cp mt API mi được đơn gin hóa để truy cp
các thư mc lưu tr bên ngoài thường dùng. </p>
<h2 id="accessing">Truy cp mt Thư mc lưu tr bên ngoài</h2>
<p>S dng lp <code>StorageManager</code> để ly thc th
<code>StorageVolume</code> phù hp. Sau đó to mt ý định bng cách gi phương thc
<code>StorageVolume.createAccessIntent()</code> ca thc th đó.
S dng ý định này để truy cp các thư mc lưu tr bên ngoài. Để ly danh sách
tt c các đĩa, bao gm các đĩa media có th tháo lp, hãy s dng
<code>StorageManager.getVolumesList()</code>.</p>
<p>Đon mã sau là mt ví d v cách m thư mc
<code>Pictures</code> trong bộ nhớ lưu trữ chính được chia sẻ:</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>H thng s c gng cp quyn truy cp ti thư mc bên ngoài và nếu
cn s xác nhn quyn truy cp vi người dùng bng mt UI được đơn gin hóa:</p>
<img src="{@docRoot}images/android-7.0/scoped-directory-access-framed.png" srcset="{@docRoot}images/android-7.0/scoped-directory-access-framed.png 1x,
{@docRoot}images/android-7.0/scoped-directory-access-framed_2x.png 2x" />
<p class="img-caption"><strong>Hình 1.</strong> Mt ng dng yêu cu
truy cp ti thư mc Pictures.</p>
<p>Nếu người dùng cp quyn truy cp, h thng s gi phương thc ghi đè
<code>onActivityResult()</code> ca bn vi mã kết qu là
<code>Activity.RESULT_OK</code> và d liu ý định có cha URI. Hãy s dng
URI được cung cp để truy cp thông tin thư mc, ging như s dng các URI
được tr v bi
<a href="{@docRoot}guide/topics/providers/document-provider.html">Khuôn kh
Truy cp Kho lưu trữ</a>.</p>
<p>Nếu người dùng không cp quyn truy cp, h thng s gi phương thc ghi đè
<code>onActivityResult()</code> ca bn vi mã kết qu là
<code>Activity.RESULT_CANCELED</code> và dữ liệu ý định có giá trị null.</p>
<p class="note"><b>Lưu ý</b>: Ly quyn truy cp ti mt thư mc bên ngoài được ch định
cũng s cp quyn truy cp ti các thư mc con thuc thư mc đó.</p>
<h2 id="removable">Truy cp mt Thư mc trên phương tin tháo lp được</h2>
<p>Để s dng Truy cp Thư mc theo Phm vi nhm truy cp các thư mc trên phương tin có th tháo lp,
trước hết, hãy thêm mt {@link android.content.BroadcastReceiver} để lng nghe
thông báo {@link android.os.Environment#MEDIA_MOUNTED}, ví dụ:</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Khi người dùng kết ni mt phương tin có th tháo lp như th SD thì h thng s gi mt thông báo
{@link android.os.Environment#MEDIA_MOUNTED}. Thông báo này
s cung cp mt đối tượng <code>StorageVolume</code> trong d liu ý định mà bn có th
s dng để truy cp các thư mc trên phương tin có th tháo lp đó. Ví d sau
s truy cp thư mc <code>Pictures</code> trên phương tiện có thể tháo lắp:</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">Thc hành Tt nht</h2>
<p>Khi có thể, hãy duy trì URI truy cp thư mc bên ngoài để bn không phi
lp li yêu cu người dùng cp quyn truy cp. Khi người dùng đã cp quyn truy cp, hãy gi
<code>getContentResolver().takePersistableUriPermssion()</code> vi
URI truy cp thư mc. H thng s duy trì URI và các yêu cu
truy cp sau này s tr v <code>RESULT_OK</code> và không hin th UI xác nhn cho
người dùng na.</p>
<p>Nếu người dùng t chi quyn truy cp đến mt thư mc bên ngoài thì đừng
yêu cu truy cp li ngay lp tc. Lp đi lp li yêu cu truy cp s dn đến tri nghim
người dùng không tt.</p>