<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=360186&amp;view=findpost&amp;p=3163745</guid>
        <pubDate>Mon, 02 Jul 2012 17:11:53 +0000</pubDate>
        <title>Как дать права для камеры к собственному провайдеру?</title>
        <link>https://forum.sources.ru/index.php?showtopic=360186&amp;view=findpost&amp;p=3163745</link>
        <description><![CDATA[Felan: Есть основное приложение. У него в манифесте определены свои собственные права и провайдеры. Типа так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&#62;</div><div class="code_line">&#60;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;</div><div class="code_line">***</div><div class="code_line">&nbsp;&nbsp; &nbsp;android:versionName=&quot;1.6.0&quot; &#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;uses-sdk</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:minSdkVersion=&quot;8&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:targetSdkVersion=&quot;8&quot; /&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">***</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;permission</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:name=&quot;com.name.android.forms.viewer.FILE_PERMISSION&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:description=&quot;@string/permission_desc_file_permission&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:label=&quot;@string/permission_label_file_permission&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:protectionLevel=&quot;signature&quot; /&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">***</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;uses-permission android:name=&quot;com.name.android.forms.viewer.LAUNCH_FORM_PERMISSION&quot; /&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;application</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:icon=&quot;@drawable/icon&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:label=&quot;@string/app_name&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;android:theme=&quot;@style/name.Light&quot; &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;activity</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:name=&quot;com.name.android.forms.viewer.ui.activity.LogonActivity&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:label=&quot;@string/app_name&quot; &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;intent-filter&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;action android:name=&quot;android.intent.action.MAIN&quot; /&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;/intent-filter&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;/activity&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">***</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;provider</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:name=&quot;com.name.android.forms.viewer.data.FileContentProvider&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:authorities=&quot;com.name.android.forms.viewer.data.filecontentprovider&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:exported=&quot;true&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:grantUriPermissions=&quot;true&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:permission=&quot;com.name.android.forms.viewer.FILE_PERMISSION&quot; &#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#60;/provider&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;/application&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&#60;/manifest&#62;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Есть еще одно приложение, по логике, библиотека, которое вызвается из этого приложения. Запускается примерно так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;private void findStartActivityAndRun(PackageInfo info, FormInfo form) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Intent intent = new Intent(START_FORM_ACTION);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;intent.setDataAndType(ContentUris.withAppendedId(Forms.CONTENT_URI, form.getId()), &quot;vnd.android.cursor.item/vnd.name.form&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;intent.setPackage(info.packageName);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Puts account login to the form start informations.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LoginSettings loginSettings = (new LoginSettingsOpenHelper(this)).getTheLatestLoginSettings();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AccountInfo accountInfo = (new AccountManager()).getAccountByLogin(this, loginSettings.getUsername());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (accountInfo != null) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;intent.putExtra(FormApplication.ACCOUNT_ID_KEY, accountInfo.getId());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log.e(TAG, &quot;Could not find account info by login. That looks strange. Possible data corruption.&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FormManager.lastOpendForm = form;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;startActivityForResult(intent, OPEN_FORM_CODE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (Exception ex) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log.wtf(TAG, &quot;Can&#39;t launch the activity: &quot; + ex);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
И уже это приложение запускает камеру, для того, что бы сделать фотографии:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;private void takePhotoImpl(int localDocId) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FileManager manager = new FileManager();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FileInfo file = new FileInfo();</div><div class="code_line">&nbsp;</div><div class="code_line">*** &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;file.setName(newFileName);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;file.setLocalDocumentId(localDocId);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;file.setStatus(Files.STATUS_ADDED);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;file.setFileName(manager.getFilePrefixPath(this, file) + localDocId + &quot;_&quot; + checklistLocalId + &quot;_&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ file.getLocalPageId() + &quot;.jpg&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;currentPhotoBeingTaken = file;</div><div class="code_line">&nbsp;</div><div class="code_line">*** &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Log.d(TAG, &quot;I&#39;m going to save photo by the path: \&quot;&quot; + file.getFileName() + &quot;\&quot;&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse(file.getFileName()));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;intent.setFlags(intent.getFlags() | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;startActivityForResult(intent, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
После этого запускается камера и можно делать фотки. Проблема в том, что после того как фотка сделана при нажатии на кнопку save, что бы сохранить ее, вылетает исключение:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): FATAL EXCEPTION: main</div><div class="code_line">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</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.access00(ActivityThread.java:117)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.os.Handler.dispatchMessage(Handler.java:99)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.os.Looper.loop(Looper.java:130)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.main(ActivityThread.java:3687)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at java.lang.reflect.Method.invokeNative(Native Method)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at java.lang.reflect.Method.invoke(Method.java:507)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at dalvik.system.NativeStart.main(Native Method)</div><div class="code_line">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</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.os.Parcel.readException(Parcel.java:1322)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.os.Parcel.readException(Parcel.java:1276)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:1882)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.getProvider(ActivityThread.java:3351)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.acquireProvider(ActivityThread.java:3376)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1828)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.content.ContentResolver.acquireProvider(ContentResolver.java:748)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:479)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.content.ContentResolver.openOutputStream(ContentResolver.java:359)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.content.ContentResolver.openOutputStream(ContentResolver.java:335)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at com.sec.android.app.camera.Camera.onActivityResult(Camera.java:2882)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.Activity.dispatchActivityResult(Activity.java:3908)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)</div><div class="code_line">07-02 18:53:30.442: E/AndroidRuntime(6793): &nbsp; &nbsp; ... 11 more</div><div class="code_line">07-02 18:53:30.454: W/ActivityManager(119): &nbsp; Force finishing activity com.sec.android.app.camera/.Camera</div><div class="code_line">07-02 18:53:30.458: E/(119): Dumpstate &#62; /data/log/dumpstate_app_error</div></ol></div></div></div></div><br>
<br>
Понятно, что не хватает прав у приложения камеры для сохранения файла по предложенному пути.<br>
Если в манифесте основного приложения у профайдера отключить права, т.е. убрать строчки<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:grantUriPermissions=&quot;true&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:permission=&quot;com.icertainty.android.forms.viewer.FILE_PERMISSION&quot; &#62;</div></ol></div></div></div></div><br>
<br>
То фотография нормально сохраняется.<br>
<br>
Не подскажет ли кто-нибудь, как сделать так, что бы фотография сохранялась и с установленными правами?<br>
<br>
Чтение <a class='tag-url' href='http://developer.android.com' target='_blank'>http://developer.android.com</a> не помогло. Танцы с &lt;grant-uri-permission&gt; тоже не помогли. Вообще там написано, что динамически права назначить нельзя, но можно временно разрешить... вот как это сделать я не понял.<br>
<br>
В манифесте для FILE_PERMISSION указан protectionLevel=&quot;signature&quot;, но я пробовал разные. В том числе и normal. Не помогло. Думал камера же другое приложение с дургой подписью...]]></description>
        <author>Felan</author>
        <category>Android</category>
      </item>
	
      </channel>
      </rss>
	