Отказ в разрешении при загрузке файла в тесте эспрессо - PullRequest
0 голосов
/ 08 июня 2018

Я новичок в Android.Я написал свою деятельность на Kotlin и мои тесты на Java.Я пытаюсь запустить тест эспрессо в приложении для Android, и у меня появляется следующее сообщение об ошибке при попытке загрузить файл из моей основной деятельности.Кто-нибудь может помочь?

Вот код, который я использую для функции, которая загружает данные из файла в моем классе Activity:

fun loadImage(uri: Uri){
    //get the input stream of the image selected using its uri
    val inputStream = contentResolver.openInputStream(uri)
}

Чтобы запустить тест, я добавил вручнуюфайл в эмулятор, чтобы получить его URI.Следующий код относится к тесту:

@RunWith(AndroidJUnit4.class)
public class testGallery {
    @Rule
    public IntentsTestRule<MainActivity> mActivity = new IntentsTestRule<> (MainActivity.class);

  @Rule
  public GrantPermissionRule grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);

    @Test
        public void test_uploadImage() {
            Uri uri = Uri.parse("content://com.android.providers.downloads.documents/document/32");
            Intent resultData = new Intent();
            resultData.setAction(Intent.ACTION_OPEN_DOCUMENT);
            resultData.putExtra("Uri", uri);
            Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);

            this.mActivity.getActivity().grantUriPermission("com.intern_firstapp_juan", Uri.parse("content://com.android.providers.downloads.documents/document/32"), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

            mActivity.getActivity().uploadImage(uri);
        }
}

Наконец, это трассировка стека, которая появляется при запуске теста.

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{54c088b 24178:com.example.hdhanushkodi.myapplication/u0a88} (pid=24178, uid=10088) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
at android.os.Parcel.createException(Parcel.java:1942)
at android.os.Parcel.readException(Parcel.java:1910)
at android.os.Parcel.readException(Parcel.java:1860)
at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:4191)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:5963)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2576)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1819)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1433)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1286)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1006)
at android.client.mobile.com.intern_firstapp_juan.MainActivity.uploadImage(MainActivity.kt:105)
at android.client.mobile.com.intern_firstapp_juan.testGallery.test_uploadImage(testGallery.java:82)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:129)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:527)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at android.support.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:101)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2136)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:12088)
at com.android.server.am.ActivityManagerService.getContentProvider(ActivityManagerService.java:12485)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:357)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3268)
at android.os.Binder.execTransact(Binder.java:731)

Вот мой файл AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.client.mobile.com.intern_firstapp_juan">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".ShowImageActivity">
        </activity>

    </application>

</manifest>
...