android許可權拒絕
Ⅰ Android帶許可權的操作,怎麼判斷是否被拒絕
Android帶許可權的操作,判斷是否被拒絕,可以使用AppOpsManager 這個類提供的方法來判斷,代碼如下: /* * 檢查某項許可權是否被允許還是拒絕 * * @param context * @param op * 許可權代碼 * @return 1為拒絕,0為允許 */ @TargetApi(19) private int checkOp(Context context, int op) { final int version = Build.VERSION.SDK_INT; if (version >= 19) { try { AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); Method dispatchMethod = AppOpsManager.class.getMethod( "checkOp", new Class[] { int.class, int.class, String.class }); int mode = (Integer) dispatchMethod.invoke( appOpsManager, new Object[] { op, Binder.getCallingUid(), context.getPackageName() }); return mode; } catch (Exception e) { e.printStackTrace(); } } return -1; }
Ⅱ Android申請許可權,拒絕、永久拒絕
例如
申請定位許可權:
if (Build.VERSION.SDK_INT >=M && !hasPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
String[] permissions =new String[1];
permissions[0] = Manifest.permission.ACCESS_COARSE_LOCATION;
Log.e("TAG", "onRequestPermissionsResult 申請許可權");
//申請許可權
ActivityCompat.requestPermissions(this, permissions,MY_LBS_PERMISSION_REQUEST_CODE);
}
//處理許可權請求
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode ==MY_LBS_PERMISSION_REQUEST_CODE) {
boolean isAllGranted =true;
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted =false;
break;
}
}
if (isAllGranted) {
Log.e("TAG", "onRequestPermissionsResult 同意");
}else {
List notAsk =new ArrayList<>();
for (String permission : permissions) {
Log.e("TAG", "onRequestPermissionsResult - 循環 -");
if (!ActivityCompat.(this, permission)
&& ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
notAsk.add(permission);
}
}
if (notAsk.size() >0) {//拒絕不再提醒
Log.e("TAG", "onRequestPermissionsResult 拒絕不再提醒");
}else {
Log.e("TAG", "onRequestPermissionsResult 本次拒絕");
}
}
}
}
/**
* 檢查是否有某個許可權
* @param context context
* @param permission 許可權
* @return true means has
*/
public static boolean hasPermission(Context context, String permission) {
return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
}
Ⅲ 安卓許可權控制指南
早期的 Android 系統沒有現在這么多許可權控制設定,管理功能也較不完善(其實是因為當時軟體申請的許可權也沒有現在這么過分)。
在 Android 4.0 中,谷歌對許可權系統進行了改進,於是再經過各大手機廠商的優化,每個國內定製系統就有了如今的許可權管理功能。
許可權管理,各大品牌其實差不多。
就我用過的幾個品牌來講,華為的許可權管理最好,小米其次,OPPO 最差。
當然,這里的「差」是相對的,相對於原生 Android 系統來說,這些廠商的許可權管理做的都很好。
(其實是因為 Google Play 的審核比較嚴格,上架的軟體幾乎都很克制)
所以,如果你要買新手機,在預算充足的情況下,選華為吧。不只是因為技術很牛,可定製性上也很好。
目前,安卓系統的許可權主要分為以下幾類:
這里,重點解釋一下某些許可權的用途。
獲取 IMEI 碼:很多應用都會申請這一許可權, 讀取手機的唯一識別碼 (估計是用於用戶的身份驗證和判斷多開)
存儲:這里指的是 內置存儲的讀寫許可權 ,不包含系統 Android/data 文件夾下的應用私有文件夾,如果這些應用需要在根目錄下存儲數據,則必須擁有該許可權。
讀取位置信息: 只有在已經開啟位置信息開關時,應用才能讀取該信息 。這項許可權不包含加速度計等感測器。
讀取已安裝應用列表: 允許應用讀取已經安裝的軟體 ,一些應用中讓用戶選擇其它應用的功能就是這樣實現的。
身體感測器:允許應用使用諸如 計步器 等感測器。這可以實現計步功能。
運動數據:也可以實現計步功能,但這項許可權是 依賴系統自帶的計步演算法 實現的,這也是有些計步軟體的數據和其它軟體數據不同的原因。
創建快捷方式:你在手機主屏上看到的 APP 圖標就屬於快捷方式,但這是系統在應用安裝完成後自動創建的。這項許可權允許應用 主動創建快捷方式 (比如微信小程序的圖標和的「寫文章」按鈕)。
懸浮窗:微信視頻聊天時切換到其它應用或主屏,這就是懸浮窗。但輸入法不屬於懸浮窗。
忽略電池優化:在 Android 6.0 以上系統中,有一種成為 Doze 模式的省電策略。在這種模式下,應用的聯網將被禁止,直到下一個窗口或接收到 Google 高優先順序推送(需要開發者和網路環境支持)。該許可權允許應用在這種模式下連接網路。
是否授予軟體相應的許可權,取決於該軟體的功能和你的需要。
例如,在導航軟體中,獲取位置信息是一項核心許可權,但在效率軟體中並不是。
對於所有軟體,都建議啟用「獲取 IMEI 碼」許可權 ,否則會給開發者帶來不便,也會影響用戶體驗(國內的一些軟體甚至會在啟動時進行檢查,如該許可權未開啟則不能使用軟體)。
建議對所有軟體關閉「撥打電話」和除「存儲」以外的所有操作類許可權(考慮到可能會有惡意軟體利用這些許可權進行扣費)。
建議關閉除「獲取位置信息」和「讀取已安裝應用列表」以外的所有讀取類許可權( 注意:關閉「讀取簡訊」許可權會導致部分應用無法自動填充簡訊驗證碼,但考慮到國內 ROM 對此都有一定優化,故不建議開啟該許可權 )
對於位置信息許可權,我建議以下軟體保持開啟:
其它軟體要求位置信息許可權的,一律拒絕(有些軟體失去此許可權可能不能正常運行,視情況而定)
至於「讀取已安裝應用列表」許可權,凡是不需要獲取其它軟體名稱的,都可以拒絕此許可權。
攝像頭和錄音許可權比較好判斷,凡是軟體需要這些功能的,都應該允許,否則拒絕即可。
身體感測器和運動數據許可權除計步軟體外均選擇拒絕。
創建快捷方式許可權,目前我打開的軟體只有一個:com.tencent.mm 包名,slogan 是「生活方式」,啟動界面是月亮的那個國民級應用。
懸浮窗許可權,一部分輔助類軟體需要打開,比如手機管家和綠色守護,以及前面提到的那個國民級應用的視頻懸浮窗。
至於開機自啟動等關於後台省電的許可權,請看下期......
Ⅳ android6.0許可權拒絕後怎麼處理
拒絕後,提示框提示許可權被拒,然後兩個選項:賦予許可權->彈出許可權提醒 不賦予許可權->退出應用
Ⅳ Android帶許可權的操作,怎麼判斷是否被拒絕
Android帶許可權的操作,判斷是否被拒絕,可以使用AppOpsManager 這個類提供的方法來判斷,代碼如下:
/*
* 檢查某項許可權是否被允許還是拒絕
*
* @param context
* @param op
* 許可權代碼
* @return 1為拒絕,0為允許
*/
@TargetApi(19)
private int checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
try {
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
Method dispatchMethod = AppOpsManager.class.getMethod(
"checkOp", new Class[] { int.class, int.class,
String.class });
int mode = (Integer) dispatchMethod.invoke(
appOpsManager,
new Object[] { op, Binder.getCallingUid(),
context.getPackageName() });
return mode;
} catch (Exception e) {
e.printStackTrace();
}
}
return -1;
} 望採納~ 謝謝!
Ⅵ 判斷android用戶拒絕了某項許可權這個問題您解決了嗎
判斷android用戶拒絕了某項許可權這個問題您解決了嗎 源碼中被用來檢查和請求許可權的方法分別是Activity的checkSelfPermission和requestPermissions。這些方法api23引入,如下代碼:
private static final String TAG = "Contacts"; private void insertDummyContact() { Two operations are needed to insert a new contact. ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2); First, set up a new raw contact. ContentProviderOperation.Builder op = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null); operations.add(op.build()); Next, set the name for the contact. op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "__DUMMY CONTACT from runtime permissions sample"); operations.add(op.build()); Apply the operations. ContentResolver resolver = getContentResolver(); try { resolver.applyBatch(ContactsContract.AUTHORITY, operations); } catch (RemoteException e) { Log.d(TAG, "Could not add a new contact: " + e.getMessage()); } catch (OperationApplicationException e) { Log.d(TAG, "Could not add a new contact: " + e.getMessage()); } }
支付許可權檢查失敗 這個問題解決了嗎
貌似微信刷卡支付 是微信服務號的? 具體有個區分 你去官方查下 在API的代碼中 跟許可權相關的官方返回只有NOAUTH: 商戶無許可權 支付確認失敗 商戶沒有開通被掃支付許可權 請開通商戶號許可權。
本文是關於支付寶介面接入時許可權驗證失敗sign和mysign不等問題的解決方案,本來是幾天前遇到的問題,解決了一直沒時間來整理,在忙公司的項目和自己的一個虛擬空間的網站(:bosstoy.),在做支付寶接入的一些代碼,之前也做過,但這一次遇到的問題是最徹底的,網上關於sign和mysign的文章蠻多,但情況也很多,非常零散,我根據網上的這些文章記錄的內容和自己遇到的問題作了一個整理,記錄下來,方便以後查閱,同時也希望能有同樣問題的朋友可以解決掉這個問題。
sign和mysign不等的問題,根據官方提供的解決方案,需要從以下方面去檢查,以下引用自官方原文:
通知返回時,支付寶返回給商家網站眾多信息中,包含一個簽名結果(sign),商家對其他所有信息進行加密簽名後會得到一個簽名結果(mysign),如果要驗證介面其有效性,需要把sign與mysign做比較,在MD5加密中,是做相等校驗。
而出現不等的原因是:
安全校驗碼沒有填寫或填寫不正確、請求時的參數格式不正確(如:有帶自定義參數等)、編碼格式混亂等。
解決方法:
1、檢查安全校驗碼(參數key)是否有填寫,且沒有空格,是否是32位字元串
2、檢查請求參數show_url、return_url、notify_url是否有帶自定義參數,去掉自定義參數,
:xxx./alipay/return_url.asp?id=123
?id=123,「?」以後帶的參數都是自定義參數
3、 編碼格式亂碼。檢查亂碼的方法,可用寫日誌函數(log_result)來記錄中文部分的數據是否亂碼。如果亂碼則確定是編碼格式設置不一致,導致亂碼。 具體請檢查編碼格式參數input_charset、頁面屬性編碼、網站項目整體編碼等,確保傳遞數據時沒有亂碼。
原文網址::help.alipay./support/help_detail.htm?help_id=243094
官方原文對於這個問題出現的原因也做了解釋和出了相應的解決方案,但因為比較精煉,沒有更詳細的描述。往往還不能直接解決掉問題。比如這里提到的參數,是否帶有自定義參數,我能確認沒有定義自定義參數傳出去,但最終檢查出問題的原因還是因為傳回的消息數組裡面含有了一個多餘的參數導致sign和mysign不等,這個多餘的參數是__URL__,分析這個參數還是因為thinkphp框架自己再處理提交的時候傳出去的,在代碼裡面過濾掉這個參數sign和mysign就正常了。
在alipay_function.php修改以下代碼。紅色部分就是我自定義的參數,過濾掉就好了
/**除去數組中的空值和簽名參數
*$parameter 簽名參數組
*return 去掉空值與簽名參數後的新簽名參數組
*/
function para_filter($parameter) {
$para = array();
while (list ($key, $val) = each ($parameter)) {
if($key == 「sign」 || $key == 「sign_type」 || $val == 「」 || $key == 『__URL__』 )continue;
else $para[$key] = $parameter[$key];
}
return $para;
}
附正常的支付介面返回的參數列表,大家可以作一個參數比較,方便檢查:
執行日期:20120619143609responseTxt=truenotify_url_log:sign=&mysign=,buyer_email=xx@163.&buyer_id=2088702249568542&exterface=create_direct_pay_by_user&is_suess=T¬ify_id=RqPnCoPT3K9/¬ify_time=2011-10-11 17:48:46¬ify_type=trade_status_sync&out_trade_no=ai-20-1318325559&payment_type=1&seller_email=xxo@gmail.& seller_id=2088002118761435&subject=充值&total_fee=0.01& trade_no=2011101140268254&trade_status=TRADE_SUCCESS&sign=&sign_type=MD5
在解決問題的過程中,還看到很多其他的情況導致sign和mysign不等,大家可以對比著看一下:
第一種情況:由於編碼導致中文傳回是亂碼的情況導致sign和mysign不等。可參考這篇文章的案例
:imlqw./322.
第二種情況:由於post和get提交的問題導致sign和mysign不等,可參考以下文章:
:my.oschina./u/214582/blog/52140
第三種情況:由於官方提供的paraFilter方法bug問題導致sign和mysign不等,可參考一下文章:
:.alipay./read-htm-tid-10244623-page-e.
第四種情況:由於參數問題導致的sign和mysign不等的情況。在這里再說明一下,前面三種是在遇到sign和mysign不等的時候查閱到的一些其他情況,我試驗過上面的方法,但都不是因為這些原因引起的,我的sign個mysign不等是因為thinkphp框架在提交信息的時候自動加入了參數造成的問題。大家在檢查參數的時候一定要考慮到框架的影響。
這個問題你解決了嗎?解決了教我下
問題補充:現在的蘋果電腦可以裝雙系統了,我說的語音問題是XP狀態下的,這個我知道,看看XP下的QQ不能解決 解決得靠騰訊軟體對mac系統的支持度了
這個問題你解決了嗎?
解決了,win7升級就好了,是s不太兼容
您這個問題解決了嗎?真誠求教!
鏈接是什麼?
as與js通訊這個問題你解決了嗎?
用stageWebView擴展類 stageWebViewBridge 就可以了
這個電話您拒絕了嗎?
作為公司的負責人或采購,我們每天不知道要接多少電話,其中不乏也有一些成交的,還有一些潛在的,現時不是很需要但談話談得比較來得,也會感興趣的去聽而且會記錄聯系方式、索要資料,有些只是會耐心地聽下去,還有一些會直接拒絕,作為當事人我把自己拒絕電話的感受寫下來,第一是提醒自己,在給客戶打電話時不可犯的錯誤,第二是希望能給經常通過電話做銷售的朋友們提個醒。第三更希望大家能發表一下意見,將您平時拒絕電話的原因寫下來,讓我們更多的銷售朋友們看到、讀到、領悟到,起到既減少接聽煩人電話的作用,同時又能幫助銷售朋友們提高電話業務的成功率。
1、推銷和我公司產品、業務不相乾的會遭受拒絕;
4、說話拖長音調、嗲聲嗲語的、故意套近乎的會遭受拒絕;
5、說話躲躲閃閃的會遭受拒絕;
6、注意力不集中的、毫無表情的電話會遭受拒絕;
7、不直接說明來意,繞著圈子說話,讓我反復去問才回答的遭受拒絕;
8、表明我們不需要此產品後還反復打電話的遭受拒絕;
9、第一次打電話就要求馬上來我公司面談的多數會拒絕;
珍惜你的每一次通話,珍惜你的話費支出。不要把你的電話當成是免費電話!
希望朋友們打電話開心!接電話也開心!
謝謝您幫我解決了這個問題!
9:bac
您好 您的問題解決了嗎?我也遇到了這個問題
你好,很高興為你解答
你的問題表達不清楚
你遇到了什麼問題需要解決呢?
建議補充完整問題
或是重新提問
滿意請採納。
Ⅶ 判斷android用戶拒絕了某項許可權這個問題您解決了嗎
源碼中被用來檢查和請求許可權的方法分別是Activity的checkSelfPermission和requestPermissions。這些方法api23引入,如下代碼:
java">privatestaticfinalStringTAG="Contacts";
privatevoidinsertDummyContact(){
//.
ArrayList<ContentProviderOperation>operations=newArrayList<ContentProviderOperation>(2);
//First,setupanewrawcontact.
ContentProviderOperation.Builderop=
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME,null);
operations.add(op.build());
//Next,setthenameforthecontact.
op=ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
"__");
operations.add(op.build());
//Applytheoperations.
ContentResolverresolver=getContentResolver();
try{
resolver.applyBatch(ContactsContract.AUTHORITY,operations);
}catch(RemoteExceptione){
Log.d(TAG,"Couldnotaddanewcontact:"+e.getMessage());
}catch(){
Log.d(TAG,"Couldnotaddanewcontact:"+e.getMessage());
}
}
Ⅷ 如何判斷android用戶拒絕了某項許可權
Android框架包含了對各種Camera以及其上可用的Camera功能的支持,它允許你在應用程序中抓拍照片和視頻。
注意事項
在開啟應用程序使用Android設備上的Camera功能之前,要考慮一些打算如何使用這些硬體功能的問題:
1. Camera需求:要考慮應用程序是否必須要運行在有Camera的設備上,如果必須,就要在應用程序的清單中聲明Camera需求;
2. 快照或定製Camera:應用程序准備如何使用Camera?是只對抓拍或視頻剪輯感興趣?還是要應用程序提供使用Camera的新方法?對於抓拍或剪輯,要考慮使用既存的Camera應用程序。對於開發定製化的Camera功能,請看下文的「構建Camera應用程序」
基礎
Android框架通過Camera API或Camera Intent來支持拍照和錄像,以下是相關的類:
Camera
這個類是控制設備Camera的主API。在構建一個Camera應用程序時,它被用於拍照或錄像。
SurfaceView
這個類用於向用戶實時的展現Camera的預覽。
MediaRecorder
這個類用於記錄來自Camera的視頻
Intent
MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE類型的Intent動作被用於不直接使用Camera對象來拍照或錄像。
清單聲明
在開始使用Camera API開發應用程序之前,要確保清單文件已經有了適當的聲明,以允許使用Camera硬體和其他相關的功能。
1. Camera許可權:應用程序必須申請使用設備Camera的許可權。
<uses-permissionandroid:name="android.permission.CAMERA"/>
注意:如果通過Intent來使用Camera,應用程序就不需要申請這個許可權。
2. Camera功能:應用程序還必須要聲明打算使用的Camera功能,例如:
<uses-featureandroid:name="android.hardware.camera"/>
把Camera功能添加到應用程序的清單中,會讓Google Play防止把程序安裝到不包含Camera或不支持你所需要的Camera功能的設備上。關於如何使用基於功能過濾的Google Play,請看Google Play和基於功能的過濾
如果應用程序能夠使用Camera或正確的操作Camera功能,但卻不需要它,那麼就應該在清單中指定android:required屬性,並把屬性值設置為false:
<uses-feature android:name="android.hardware.camera" android:required="false" />
3. 存儲許可權:如果應用程序要把圖片或視頻保存到設備的外部存儲器上(如SD卡),就必須在清單中指定這個許可權:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4. 音頻錄音許可權:對於視頻採集的音頻錄音,應用程序必須要申請音頻採集許可權:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>
5. 位置定位許可權:如果應用程序要給圖片標記GPS位置信息,就必須申請位置定位許可權:
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
關於獲得用戶位置的更多信息,請看「定位策略」
使用既存的Camera應用
在應用程序中不需要太多的額外代碼就可以快速的開啟拍照或錄像的方法是:使用Intent來調用一個既存的Android Camera應用程序。一個Camera Intent能夠通過既存的Camera應用程序和它返回給應用程序的播放控制來申請採集一張照片或一段視頻。本節會向你展示如何使用這項技術來採集一張圖片或一段視頻。
調用Camera Intent的過程會遵循以下這些大概的步驟:
1. 編寫一個Camera Intent:創建一個申請圖片或視頻的Intent對象,使用以下Intent類型之一:
MediaStore.ACTION_IMAGE_CAPTURE:從一個既存的Camera應用中申請圖片功能的Intent動作類型;
MediaStore.ACTION_VIDEO_CAPTURE:從一個既存的Camera應用中申請視頻功能的Intent動作類型。
2. 啟動Camera的Intent:使用startActivityForResult()方法來執行Camera的Intent。Intent啟動後,該Camera應用程序的用戶界面會顯示在屏幕上,並且用戶能夠拍照或錄像;
3. 接收Intent的結果:在你的應用程序中建立一個onActivityResult()方法來接收來自Camera Intent的回調和數據。當用戶完成成拍照或錄像(或者是取消操作),系統會調用這個方法。
圖像採集Intent
使用Camera Intent來採集圖像是你的應用程序用最少的代碼來拍照的快捷方式。一個圖片採集Intent能夠包含以下額外的信息:
MediaStore.EXTRA_OUTPUT:這個設置需要一個指定了保存圖片路徑和文件名的Uri對象。這個設置是可選,但強烈推薦使用。如果不指定這個值,Camera應用程序會用默認的名稱把採集到的圖片保存到默認的位置,這些默認值在Intent.getData()方法的返回欄位中指定。
以下示例演示了如何構建一個圖片採集Intent,並執行它。示例中GetOutputMediaFileUri()方法引用了下面「保存媒體文件」一節中的示例代碼:
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
startActivityResult()方法執行完成後,用戶就會看到Camera應用程序的界面。用戶完成拍照(或取消操作)之後,用戶界面就會返回到你的應用程序中,並且你必須監聽onActivityResult()方法來接收Intent的結果,並繼續你的應用程序的執行。
視頻採集Intent
使用Camera Intent採集視頻是讓你的應用程序能夠用最少的代碼來錄像的一中快捷方式。視頻採集Intent能夠包含以下額外信息:
MediaStore.EXTRA_OUTPUT:這個設置要求用一個URI來指定保存視頻的路徑和文件名。雖然它是可選的,但強烈推薦使用這個設置。如果沒有指定這個設置,那麼Camera應用程序會把採集到的視頻用默認的名稱保存到默認的位置,默認的設置是在Intent的Intent.getData()方法域中返回的。
MediaStore.EXTRA_VIDEO_QUALITY:這個值的范圍是0~1,0的時候質量最差且文件最小,1的時候質量最高且文件最大。
MediaStore.EXTRA_DURATION_LIMIT:這個值以秒為單位,顯示視頻採集的時長。
MediaStore.EXTRA_SIZE_LIMIT:這個值以位元組為單位,限制視頻採集的文件大小。
下面的示例演示了如何構造一個視頻採集的Intent,並執行它。這個例子中的getOutputMediaFileUri()方法引用了下文的「保存媒體文件」中的示例代碼:
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
當startActivityForResult()方法被執行時,用戶就會看到一個可編輯的Camera應用程序界面。在用戶完成錄像(或取消操作)之後,該用戶界面就會返回到你的應用程序中,並且你必須監聽onActivityResult()方法來接收Intent的結果,並繼續執行你的應用程序。
接收Camera Intent結果
一旦你構建並執行了一個圖片或視頻的Camera Intent,那麼就必須要配置你應用程序來接收Intent的結果。本節向你展示了如何監聽來自Camera Intent的回調,以便應用程序能夠對採集到的圖片或視頻做進一步的處理。
為了接收Intent的結果,必須在啟動Intent的那個Activity中重寫onActivityResult()方法。下面的示例演示了如何重寫onActivityResult()方法來採集圖片Camera Intent或視頻Camera Intent的返回結果:
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
一旦Activity接收到一個成功的結果,那麼你的應用程序就可以訪問指定位置中的被採集的圖片或視頻。
Ⅸ 安卓請求許可權
有時候我們的應用需要讀寫sd卡,就需要android.permission.WRITE_EXTERNAL_STORAGE許可權,但是它屬於危險型許可權。光在Manifest中配置還不夠,你還需要運行時請求去用它們。
以下就以Mainfest.permission.WRITE_EXTERNAL_STORAGE為例,
1)檢測是否擁有許可權
2)如果沒有許可權就請求許可權
requestPermission()是個非同步請求方法,調用它之後,Android會彈出系統許可權授權對話框要求用戶反饋。
為響應用戶操作,還需要重寫onRequestPermissionResult()響應方法,用戶點擊 允許 或 拒絕 按鈕後,Android就會調用這個方法。
然後我們在這個方法里檢測是否擁有許可權,如果有許可權,就...。
如果你點擊了 允許 按鈕給予許可權,除非卸載或關閉許可權,應用會一直擁有該許可權。如果選了拒絕,應用的授權只是暫時被否。下次要獲取讀寫文件的話,可以繼續用requestPermission()來請求許可權。