无法从浓缩咖啡测试访问内容提供商

时间:2019-07-19 08:48:46

标签: android android-contentprovider android-espresso

我有一个带有更多模块的应用程序。在模块A中,我有一个内容提供程序。在模块B中,我正在访问该内容提供商。该应用程序工作正常,我可以访问数据。我的问题是,当我尝试为某项活动编写Android检测测试时。在onCreate方法的该活动中,我正在调用一个异步任务,该任务需要通过内容提供者访问数据库并用该数据填充该活动。在这一刻,我遇到一个错误:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.mycompany.dashboardlight.test, PID: 19196
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:318)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:762)
 Caused by: java.lang.SecurityException: Permission Denial: opening provider com.mycompany.data.provider.HibpAccountProvider from ProcessRecord{7e4d57b 19196:com.mycompany.dashboardlight.test/u0a265} (pid=19196, uid=10265) that is not exported from uid 10264
    at android.os.Parcel.readException(Parcel.java:1693)
    at android.os.Parcel.readException(Parcel.java:1646)
    at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4912)
    at android.app.ActivityThread.acquireProvider(ActivityThread.java:6043)
    at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2474)
    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1521)
    at android.content.ContentResolver.query(ContentResolver.java:520)
    at android.content.ContentResolver.query(ContentResolver.java:478)

我尝试使两个模块具有相同的shareUserId,分隔读写权限,但是没有任何效果。

这在内容提供者所在的清单中:

 <provider
android:name="com.mycompany.data.provider.MyProvider"
android:authorities="${applicationId}.data.MyProvider"
        android:enabled="true"
        android:exported="false"
        />

这是访问数据的模块中的清单:

<uses-permission 
android:name="${applicationId}.data.MyProvider"/>

为无法访问内容提供商的活动创建其他测试可以正常工作。

这是测试:

@RunWith(AndroidJUnit4.class)
public class MyActivityTest {


@Rule
public final ActivityTestRule<MyActivity> breachMain = new 
ActivityTestRule<>(MyActivity.class);


@Test
public void isLaunchScreenDetected() {
    onView(withText("No Data Breach 
Found")).check(ViewAssertions.matches(isDisplayed()));
    }
}

1 个答案:

答案 0 :(得分:0)

最后一个解决方案。问题在于如何定义权限。在安装应用程序和尝试测试应用程序时,applicationId是不同的。在测试应用程序时,您可能会注意到在您的程序包名称上附加了.test,在我的情况下,由于我在代码中使用了较低的硬编码值com.mypackage,这导致了权限被拒绝。所以我以不同的权限结束,因为在安装应用程序和运行测试时applicationId是不同的。

我的建议是,如果您还在Java类中定义AUTHORITY,请避免$ {applicationId}不要混用。