我写了一个文件内容提供商。当我将它放入单个活动应用程序时,它的工作非常完美。 但是,当将它放入具有多个活动的应用程序时,它将不再起作用。我总是得到文件路径无效的错误。 内容提供商活动不是主要活动。文件是沙箱文件文件夹中的存储。
我将在这里更具体一点。我有一个多项目eclipse工作区。主项目没有实现内容提供者。在我们的应用程序中,我们希望提供一个文件内容提供程序,为adobe reader x提供pdf文档。下载文件并应将其提供给内容提供者的应用程序部分在单独的项目中实现。在清单文件中声明存在内容提供者。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxxxxxxxx.documents"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="12" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="DocumentActivity"
android:name=".DocumentActivity"
android:theme="@android:style/Theme.Holo" >
</activity>
<provider
android:authorities="xxxxxxxxx.DocumentProvider"
android:enabled="true"
android:exported="true"
android:grantUriPermissions="true"
android:name="xxxxxxxxx.DocumentProvider"
android:syncable="false" />
</application>
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
意图如此触发(工作正常!):
if(file.exists())
{
this.loadingIndicator.setVisibility(View.GONE);
// Start Content Provider Intent
Intent i = new Intent();
i.setDataAndType(Uri.parse("content://xxxxxxxxx.DocumentProvider/" + file.getPath()), "application/pdf");
Log.d(TAG, "Loading of PDF Document finished!");
startActivity(i);
}
我还有一个演示项目,其中内容提供者在主清单中注册。这很完美,所有文档都已加载。
内容提供商本身没有改变。从来没有调用过该方法: 公共类DocumentProvider扩展了ContentProvider { private static final String TAG =“DocumentProvider”;
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException
{
File file = new File(uri.getPath());
Log.d(TAG, file.getAbsolutePath());
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
}
我更改了所有uri链接,通过复制主应用程序项目中的内容提供程序类测试了不同的方法,没有任何效果。 Adobe Reader X始终返回文件路径不正确。