我有一个带有更多模块的应用程序。在模块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()));
}
}
答案 0 :(得分:0)
最后一个解决方案。问题在于如何定义权限。在安装应用程序和尝试测试应用程序时,applicationId是不同的。在测试应用程序时,您可能会注意到在您的程序包名称上附加了.test,在我的情况下,由于我在代码中使用了较低的硬编码值com.mypackage,这导致了权限被拒绝。所以我以不同的权限结束,因为在安装应用程序和运行测试时applicationId是不同的。
我的建议是,如果您还在Java类中定义AUTHORITY,请避免$ {applicationId}不要混用。