На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> Как дать права для камеры к собственному провайдеру?
    Есть основное приложение. У него в манифесте определены свои собственные права и провайдеры. Типа так:

    ExpandedWrap disabled
      <?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>


    Есть еще одно приложение, по логике, библиотека, которое вызвается из этого приложения. Запускается примерно так:
    ExpandedWrap disabled
          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);
              }
          }


    И уже это приложение запускает камеру, для того, что бы сделать фотографии:
    ExpandedWrap disabled
          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, что бы сохранить ее, вылетает исключение:

    ExpandedWrap disabled
      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


    Понятно, что не хватает прав у приложения камеры для сохранения файла по предложенному пути.
    Если в манифесте основного приложения у профайдера отключить права, т.е. убрать строчки
    ExpandedWrap disabled
                  android:grantUriPermissions="true"
                  android:permission="com.icertainty.android.forms.viewer.FILE_PERMISSION" >


    То фотография нормально сохраняется.

    Не подскажет ли кто-нибудь, как сделать так, что бы фотография сохранялась и с установленными правами?

    Чтение http://developer.android.com не помогло. Танцы с <grant-uri-permission> тоже не помогли. Вообще там написано, что динамически права назначить нельзя, но можно временно разрешить... вот как это сделать я не понял.

    В манифесте для FILE_PERMISSION указан protectionLevel="signature", но я пробовал разные. В том числе и normal. Не помогло. Думал камера же другое приложение с дургой подписью...
    Сообщение отредактировано: Felan -
    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0186 ]   [ 14 queries used ]   [ Generated: 18.05.24, 07:20 GMT ]