2015-10-16 59 views
3

我正在啓動相機意圖以使用相機應用程序拍攝照片。它在我的默認版本的應用程序中按預期工作。Android for Work中的相機意圖

我已經爲我的應用程序的"Android for Work"版本實施了相同的代碼,最終出現了一個奇怪的行爲。通常,根據"Android for Work"視頻,如果Intent位於其他配置文件中,則無法處理該Intent。例如,如果我的工作資料中沒有安裝相機應用程序,Camera Intent在解析後應該爲空,這是預期的。

但在我的情況下,Camera Intent是由安裝在我的默認用戶配置文件中的Camera Application處理的(Work Profile沒有Camera應用程序)。拍攝照片後,它會返回onActivityResult,並帶有resultCodeActivity.RESULT_CANCELED

所以,我的問題是,我如何區分用戶的Real Cancel Event和這種情況?他們都有相同的結果,Activity.RESULT_CANCELED

下面的代碼顯示了我如何觸發相機意圖。

/* Create Camera Intent */ 
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

/* Check if the Camera Intent is Available */ 
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) == null) { 

    /* Notify User in Error Case */ 
    UIUtils.notifyUser(getActivity(), getString(R.string.error), getString(R.string.no_camera_application_found)); 

} else { 

    /* Create a new File with Random Photo Name */ 
    takenPhoto = new File(FileUtils.getExternalPhotoCacheDirectory(), generatePhotoName()); 
    takenPhoto.createNewFile(); 

    /* Create Uri to send to within the Intent */ 
    Uri outputFileUri = Uri.fromFile(takenPhoto); 

    /* Set Photo destination File Uri */ 
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

    /* Start Activity for Result */ 
    startActivityForResult(cameraIntent, ACTION_TAKE_PHOTO); 
} 

編輯:這裏從我的管理面板一些屏幕截圖。 Cross Profile Restrictions Applications Allowed in Work Profile

+0

您可以處理如有應用程序可以處理這個意圖,子彈 –

+0

@sadeghsaati這就是我在第一機械手做'resolveActiivty'在if語句前。但它不會返回null,意外。 – osayilgan

回答

1

作爲每setCameraDisabled()方法DevicePolicyManager

由被施用裝置禁用設備,此用戶的所有攝像機的應用程序調用。設置完成後,沒有應用程序以該用戶將能夠訪問設備上的任何攝像頭。

因此,只有運行在工作檔案中的應用程序將無法訪問攝像頭 - 因爲它讀取,這不會影響默認的用戶配置文件。

管理應用需要調用addCrossProfileIntentFilter()FLAG_PARENT_CAN_ACCESS_MANAGED禁止從工作資料中的應用程序能夠意圖父(默認用戶),以解決應用程式,如果他們不希望任何意圖從工作資料發送到用戶配置文件。現在

,如果使用ACTION_IMAGE_CAPTURE對工作資料,工作需要您的應用程序,你可以按照以下說明:

Android上的每個用戶都有一個完全沙箱的存儲空間,包括公共存儲目錄。這意味着默認的用戶配置文件Camera應用程序無法讀取任何可供工作配置文件應用程序訪問的文件目錄。

相反,您需要提供一個可以寫入的URI,例如返回的URI,如file sharing training中所述。

/* Create a new File with Random Photo Name */ 
takenPhoto = new File(getActivity().getCacheDir(), generatePhotoName()); 
takenPhoto.createNewFile(); 

/* Create Uri to send to within the Intent */ 
Uri outputFileUri = FileProvider.getUriForFile(getActivity(), 
    "your.authority.read.the.docs", takenPhoto); 

/* Set Photo destination File Uri */ 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

重要的是要注意,這裏的文件正被保存到應用程序的緩存目錄 - 而不是公共存儲位置。

您還需要包括基於開放的權限,以及:

cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
cameraIntent.setClipData(ClipData.newRawUri(null, outputFileUri)); 

通常,只有在開放的包含在setData(uri)被獲准,但任何烏里也包含在剪輯數據將有權以及,讓相機應用程序能夠讀取和寫入您的Uri。

+0

感謝您的回答。這是正確的,工作和默認用戶的存儲是分開的,但對於「Android For Work」他們都在同一時間運行。這仍然不會讓他們寫對方的存儲空間。這不是我關心的問題。 因爲如果沒有安裝「工作資料」的相機應用(受管理員限制),那麼我不希望用戶能夠訪問默認相機應用。如果受限制,用戶應該無法使用它。但是,當我啓動意圖時,工作配置文件仍然可以訪問默認配置文件中的應用程序,這不是預期的。 – osayilgan

+0

因此,任何用戶都不應該訪問默認相機應用程序,當它被限制時,或者如果它不能被阻止,resulCode返回到活動應該不同於Activity.RESULT_CANCELED,所以我可以告訴用戶爲什麼他們不能拍照。 – osayilgan

+0

僅供參考,如果我從管理面板啓用攝像頭選項(最終將攝像頭應用安裝到工作檔案中),那麼它按預期工作。 – osayilgan