Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.255.31] |
|
Сообщ.
#1
,
|
|
|
Есть основное приложение. У него в манифесте определены свои собственные права и провайдеры. Типа так:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" *** android:versionName="1.6.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> *** <permission android:name="com.name.android.forms.viewer.FILE_PERMISSION" android:description="@string/permission_desc_file_permission" android:label="@string/permission_label_file_permission" android:protectionLevel="signature" /> *** <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="com.name.android.forms.viewer.LAUNCH_FORM_PERMISSION" /> <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/name.Light" > <activity android:name="com.name.android.forms.viewer.ui.activity.LogonActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> *** <provider android:name="com.name.android.forms.viewer.data.FileContentProvider" android:authorities="com.name.android.forms.viewer.data.filecontentprovider" android:exported="true" android:grantUriPermissions="true" android:permission="com.name.android.forms.viewer.FILE_PERMISSION" > </provider> </application> </manifest> Есть еще одно приложение, по логике, библиотека, которое вызвается из этого приложения. Запускается примерно так: private void findStartActivityAndRun(PackageInfo info, FormInfo form) { try { Intent intent = new Intent(START_FORM_ACTION); intent.setDataAndType(ContentUris.withAppendedId(Forms.CONTENT_URI, form.getId()), "vnd.android.cursor.item/vnd.name.form"); intent.setPackage(info.packageName); // Puts account login to the form start informations. LoginSettings loginSettings = (new LoginSettingsOpenHelper(this)).getTheLatestLoginSettings(); AccountInfo accountInfo = (new AccountManager()).getAccountByLogin(this, loginSettings.getUsername()); if (accountInfo != null) { intent.putExtra(FormApplication.ACCOUNT_ID_KEY, accountInfo.getId()); } else { Log.e(TAG, "Could not find account info by login. That looks strange. Possible data corruption."); } FormManager.lastOpendForm = form; startActivityForResult(intent, OPEN_FORM_CODE); } catch (Exception ex) { Log.wtf(TAG, "Can't launch the activity: " + ex); } } И уже это приложение запускает камеру, для того, что бы сделать фотографии: private void takePhotoImpl(int localDocId) { FileManager manager = new FileManager(); FileInfo file = new FileInfo(); *** file.setName(newFileName); file.setLocalDocumentId(localDocId); file.setStatus(Files.STATUS_ADDED); file.setFileName(manager.getFilePrefixPath(this, file) + localDocId + "_" + checklistLocalId + "_" + file.getLocalPageId() + ".jpg"); currentPhotoBeingTaken = file; *** Log.d(TAG, "I'm going to save photo by the path: \"" + file.getFileName() + "\""); Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse(file.getFileName())); intent.setFlags(intent.getFlags() | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivityForResult(intent, 0); } После этого запускается камера и можно делать фотки. Проблема в том, что после того как фотка сделана при нажатии на кнопку save, что бы сохранить ее, вылетает исключение: 07-02 18:53:30.442: E/AndroidRuntime(6793): FATAL EXCEPTION: main 07-02 18:53:30.442: E/AndroidRuntime(6793): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2001, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.sec.android.app.camera/com.sec.android.app.camera.Camera}: java.lang.SecurityException: Permission Denial: opening provider com.name.android.forms.viewer.data.FileContentProvider from ProcessRecord{40811670 6793:com.sec.android.app.camera/10007} (pid=6793, uid=10007) requires com.name.android.forms.viewer.FILE_PERMISSION or com.name.android.forms.viewer.FILE_PERMISSION 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.access$2000(ActivityThread.java:117) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.os.Handler.dispatchMessage(Handler.java:99) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.os.Looper.loop(Looper.java:130) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.main(ActivityThread.java:3687) 07-02 18:53:30.442: E/AndroidRuntime(6793): at java.lang.reflect.Method.invokeNative(Native Method) 07-02 18:53:30.442: E/AndroidRuntime(6793): at java.lang.reflect.Method.invoke(Method.java:507) 07-02 18:53:30.442: E/AndroidRuntime(6793): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 07-02 18:53:30.442: E/AndroidRuntime(6793): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 07-02 18:53:30.442: E/AndroidRuntime(6793): at dalvik.system.NativeStart.main(Native Method) 07-02 18:53:30.442: E/AndroidRuntime(6793): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.name.android.forms.viewer.data.FileContentProvider from ProcessRecord{40811670 6793:com.sec.android.app.camera/10007} (pid=6793, uid=10007) requires com.name.android.forms.viewer.FILE_PERMISSION or com.name.android.forms.viewer.FILE_PERMISSION 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.os.Parcel.readException(Parcel.java:1322) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.os.Parcel.readException(Parcel.java:1276) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:1882) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.getProvider(ActivityThread.java:3351) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.acquireProvider(ActivityThread.java:3376) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1828) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.content.ContentResolver.acquireProvider(ContentResolver.java:748) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:479) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.content.ContentResolver.openOutputStream(ContentResolver.java:359) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.content.ContentResolver.openOutputStream(ContentResolver.java:335) 07-02 18:53:30.442: E/AndroidRuntime(6793): at com.sec.android.app.camera.Camera.onActivityResult(Camera.java:2882) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.Activity.dispatchActivityResult(Activity.java:3908) 07-02 18:53:30.442: E/AndroidRuntime(6793): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 07-02 18:53:30.442: E/AndroidRuntime(6793): ... 11 more 07-02 18:53:30.454: W/ActivityManager(119): Force finishing activity com.sec.android.app.camera/.Camera 07-02 18:53:30.458: E/(119): Dumpstate > /data/log/dumpstate_app_error Понятно, что не хватает прав у приложения камеры для сохранения файла по предложенному пути. Если в манифесте основного приложения у профайдера отключить права, т.е. убрать строчки android:grantUriPermissions="true" android:permission="com.icertainty.android.forms.viewer.FILE_PERMISSION" > То фотография нормально сохраняется. Не подскажет ли кто-нибудь, как сделать так, что бы фотография сохранялась и с установленными правами? Чтение http://developer.android.com не помогло. Танцы с <grant-uri-permission> тоже не помогли. Вообще там написано, что динамически права назначить нельзя, но можно временно разрешить... вот как это сделать я не понял. В манифесте для FILE_PERMISSION указан protectionLevel="signature", но я пробовал разные. В том числе и normal. Не помогло. Думал камера же другое приложение с дургой подписью... |