Exceção de segurança Java Android

8

No meu aplicativo, o usuário pode tirar uma foto ou adicionar uma foto ao aplicativo. Estou recebendo relatórios de falhas de java.lang.SecurityException quando o aplicativo tenta exibir a imagem salva em um ImageView

A linha em que ele errou é

holder.imageV.setImageURI(uriParsed);

Eu não consegui duplicar o erro no meu dispositivo ou nos simuladores, todos exibem a imagem corretamente.

O código completo que estou usando é

JoinProjectPicture projectPicture = mProjects.get(position);
Project current = projectPicture.getProject();
Picture picture = projectPicture.getPicture();

 holder.projectName.setText(current.getProjectName() + "(" + current.getWidth() + "x" + current.getHeight() + ")");
 holder.projectStatusTV.setText(current.getStatus());

 if(picture != null) {
      String pictureName = picture.getPictureName();
      Uri uriParsed = Uri.parse(pictureName);

      if(uriParsed != null) {
           Log.d("URIParsed", "Project: " + current.getProjectName() + " - Parsed: " + uriParsed);
           holder.imageV.setImageURI(uriParsed);
    }
}

A saída dos logs exibidos no meu dispositivo (3 projetos, um sem imagem)

Projeto: Teste - Analisado: file: ///storage/emulated/0/Android/data/com.desbrina.diamondpaintinglogbook/files/Pictures/20191111_1408166491573472523237896.jpg

Projeto: Teste 3 - Analisado: conteúdo: //com.android.providers.media.documents/document/image%3A1891

O erro

java.lang.SecurityException: 
  at android.os.Parcel.createException (Parcel.java:1966)
  at android.os.Parcel.readException (Parcel.java:1934)
  at android.os.Parcel.readException (Parcel.java:1884)
  at android.app.IActivityManager$Stub$Proxy.getContentProvider (IActivityManager.java:4039)
  at android.app.ActivityThread.acquireProvider (ActivityThread.java:6365)
  at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider (ContextImpl.java:2825)
  at android.content.ContentResolver.acquireUnstableProvider (ContentResolver.java:1835)
  at android.content.ContentResolver.openTypedAssetFileDescriptor (ContentResolver.java:1449)
  at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1302)
  at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1225)
  at android.graphics.ImageDecoder$ContentResolverSource.createImageDecoder (ImageDecoder.java:273)
  at android.graphics.ImageDecoder.decodeDrawableImpl (ImageDecoder.java:1652)
  at android.graphics.ImageDecoder.decodeDrawable (ImageDecoder.java:1645)
  at android.widget.ImageView.getDrawableFromUri (ImageView.java:952)
  at android.widget.ImageView.resolveUri (ImageView.java:921)
  at android.widget.ImageView.setImageURI (ImageView.java:532)
  at android.support.v7.widget.AppCompatImageView.setImageURI (AppCompatImageView.java:116)
  at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:88)
  at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:23)
  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder (RecyclerView.java:6781)
  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder (RecyclerView.java:6823)
  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:5752)
  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6019)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5858)
  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5854)
  at android.support.v7.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2230)
  at android.support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1557)
  at android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517)
  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:612)
  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3924)
  at android.support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3641)
  at android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:4194)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.support.constraint.ConstraintLayout.onLayout (ConstraintLayout.java:1915)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.support.v4.view.ViewPager.onLayout (ViewPager.java:1775)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at com.android.internal.policy.DecorView.onLayout (DecorView.java:1088)
  at android.view.View.layout (View.java:22406)
  at android.view.ViewGroup.layout (ViewGroup.java:6594)
  at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:3417)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2884)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1932)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8589)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:949)
  at android.view.Choreographer.doCallbacks (Choreographer.java:761)
  at android.view.Choreographer.doFrame (Choreographer.java:696)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:935)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:7094)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:975)
Caused by: android.os.RemoteException: 
  at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15677)
  at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15586)
  at com.android.server.am.ActivityManagerService.getContentProvider (ActivityManagerService.java:16151)
  at android.app.IActivityManager$Stub.onTransact$getContentProvider$ (IActivityManager.java:11035)
  at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:295)
Ceri Turner
fonte
Você já tentou criar uma versão ofuscada do seu aplicativo e testar? Funciona?
Sagar
você pode postar o log de erro completo. Você está usando uri do armazenamento do telefone?
Amit Tiwary
A TI será do armazenamento do telefone ou de dentro do aplicativo, dependendo se ele foi adicionado da galeria ou tirado da câmera no aplicativo. Falha completa adicionada
Ceri Turner
1
Verifique se o seguinte é satisfeito: Permissões de gravação e se você possui um provedor de arquivos se estiver salvando em um caminho interno personalizado.
TheRealChx101
Você está dizendo que tentou o código em emuladores. Eu recomendo testar esse código relacionado a hardware em quase todas as versões do Android. Você já experimentou no Android Pie, como as respostas abaixo sugerem?
L3n95 #

Respostas:

4

Acho que você está recebendo a exceção de segurança em um sistema operacional Android Pie ou posterior. Isso ocorre porque nesses sistemas você precisa declarar o caminho que seu aplicativo deseja usar.

Verifique: https://developer.android.com/reference/android/support/v4/content/FileProvider

Além disso, é possível que seu aplicativo esteja tentando obter conteúdo de outro aplicativo que exija permissão como o Google Fotos: <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

Marque isto: java.lang.SecurityException: Negação de permissão: provedor de abertura com.google.android.apps.photos.content.GooglePhotosImageProvider

Vatish Sharma
fonte
Estou conseguindo o 9, mas estou executando 10 e não consigo reproduzi-lo. Eu tentei reproduzi-lo em um 9 de forma semelhante ou não e possível #
Ceri Turner
Recebo esse erro ao tentar disparar uma intenção para um aplicativo de galeria de terceiros (era o google fotos no meu caso) para permitir a escolha de uma foto para o meu aplicativo. Portanto, provavelmente você também precisa de um aplicativo que precise de permissão antes de dar uma intenção a ele.
Vatish Sharma
Eu adicionei isso e ele ainda trava #
Ceri Turner
4

Na API 24, você não pode acessar o File Uris diretamente. Você precisa usar as autoridades de arquivo para a pasta e, em seguida, usar

val photoURI = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", File(path));

No AndroidManifes.xml

Adicione o seguinte para applicationmarcar. No seguinte packagename éBuildConfig.APPLICATION_ID

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="packagename.provider"
            android:enabled="true"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external"
        path="." />
</paths>
Mustansar Saeed
fonte
3

Essa exceção geralmente é causada pelo uso de imageuri de aplicativos de terceiros. A solução é implementar o provedor de arquivos. Você pode obter muitas soluções sobre como implementar o provedor de arquivos.

AkashToSky
fonte
Estou procurando e não tenho muita certeza do que preciso mudar. Atualmente eu estou adicionando as imagens usando pastebin.com/Xswi7puK e mostrando-lhes com pastebin.com/EQVvyRnG
Ceri Turner
Não, ainda está falhando #
Ceri Turner
Tentei definir imageUri em uma visualização de imagem, mas funciona bem para mim. A solução alternativa é criar um bitmap a partir da imagem e configurá-lo para visualização de imagem. Eu acho que há um problema em imageuri.onde você está conseguindo?
AkashToSky 26/11/19
Eu recebo o mesmo erro ao tentar com um bitmap. As imagens estão sendo adicionadas usando o código aqui. pastebin.com/Xswi7puK
Ceri Turner
Para o 1º caso em onActivityResult photoUri não está atribuído.
AkashToSky
2

Suspeito que isso se deva às permissões que você implementou em seu AndroidManifest.xmlarquivo. Se você estiver depurando na API Level 23versão superior ou superior do android, precisará obter a permissão de tempo de execução durante WRITE_EXTERNAL_STORAGEa execução, pois a exceção de segurança ocorre devido à permissão negada pelo dispositivo.

Omkar C.
fonte
A leitura e a gravação externas já estão no arquivo de manifesto.
precisa
A propósito, WRITE_EXTERNAL_STORAGE será descontinuado na próxima versão do Android.
user70
2

Isso ocorre porque na nova versão Android 9introduziu uma nova FOREGROUND_SERVICEpermissão; os documentos dizem:

Nota: Os aplicativos direcionados Android 9 (API level 28)ou superiores e usam serviços em primeiro plano devem solicitar o FOREGROUND_SERVICE permission. Como é uma permissão normal, o sistema concede automaticamente ao aplicativo solicitante. Se um aplicativo que tem API level 28como alvo ou superior tenta criar um serviço em primeiro plano sem solicitar FOREGROUND_SERVICE, o sistema lança a SecurityException.

Basta adicionar a permissão ao manifesto e deve fazer o truque "em teoria". Nos informe!! Algo como:

<manifest ...>   
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 
     <application ...>
</manifest>

Vamos tentar pegar essa recompensa: Você tem essas permissões ?:

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Também acho que isso não é tão ruim para tentar:

public static final String KITKAT_VALUE = 1002;

  Intent intent;

    if (Build.VERSION.SDK_INT < 19){
                            intent = new Intent();
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                        } else {
                            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == KITKAT_VALUE ) {
     if (resultCode == Activity.RESULT_OK) {
       // do something here
     }
  }
}
Qiqke
fonte
1
Eu tive um rápido olhar para a informação e não sabe como ele se aplica
Ceri Turner
Você não tem um arquivo chamado AndroidManifest.xmlonde você coloca todas as permissões como:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>
Qiqke
Eu adicionei isso e ele ainda trava #
Ceri Turner
Você está usando um terceiro serviço de aplicativo ??? talvez o terceiro dia esteja usando algumas permissões que não podem ser usadas?
Qiqke
O aplicativo de terceiros acessado é o aplicativo de fotos para telefones. A única coisa em que consigo pensar é que mudei a maneira como o acessou há algum tempo e estou me perguntando se as permissões nunca foram definidas para manter o acesso. Imagens recém-adicionadas de fotos funcionam, mas parece que as mais antigas não. É assim que as imagens são adicionadas: pastebin.com/5CcqXQQu
Ceri Turner