FileProvider抛出IllegalArgumentException

时间:2014-03-12 10:35:39

标签: android eclipse illegalargumentexception

我设计了一个Activity( MainActivity.java ),它可以在点击 CaptureButton 时捕获图像,并在点击 ShowFilesButton 时将所有捕获的图像显示在其上strong>以ListView的形式。 但我的应用程序在Emulator / Android设备上运行时遇到了崩溃,因为我收到了如LogCat中所示的以下RunTimeError。

错误Logcat的屏幕截图

Error Screenshot of Logcat android.support.v4.content.FileProvider 也出现在我的Eclipse中

android.support.v4.content.FileProvider

AndroidManifest文件中的提供者代码 - 我不确定权限属性中提供的值。

<provider
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:authorities="com.example.showinfo.fileprovider"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
</provider>

@ XML / file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path android:path="images/" android:name="myimages" />
</paths>

com.example.showinfo.MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        listfiles=(ListView)findViewById(R.id.listfiles);
        capturebutton=(Button)findViewById(R.id.captureimage);
        showfilesbutton=(Button)findViewById(R.id.showfiles);
        setContentView(R.layout.activity_main);

        capturebutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if(intent.resolveActivity(getPackageManager())!=null)
                {
                    startActivityForResult(intent,RCODE);
                }
            }
        });

showfilesbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                File rootfolder= getFilesDir();
                File folder=new File(rootfolder, "images");
                File[] files=folder.listFiles();
                String[] filenames={};
                for(int i=0;i<files.length;i++)
                    filenames[i]=files[i].getAbsolutePath();
                ArrayAdapter<String> a=new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,filenames);
                listfiles.setAdapter(a);

            //Uri contentUri=FileProvider.getUriForFile(getApplicationContext(), "com.example.showinfo.fileprovider", files[0].getAbsoluteFile());

            }
        });
}

1 个答案:

答案 0 :(得分:0)

权限只是一个标识文件提供程序的String。

FileProvider

  

将android:authorities属性设置为基于a的URI权限   您控制的域名;例如,如果您控制域   mydomain.com你应该使用权限com.mydomain.fileprovider。

在AndroidManifest.xml中,按FileProvider

  

将android:exported属性设置为false; FileProvider没有   需要公开。

您的file_paths.xml应如下所示(您不需要XML属性名称或属性前面的 android:):

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path path="images/" name="myimages" />
</paths>

在您的MainActivity.java中 - 这应该在startActivityForResult(intent,RCODE);之前:

Uri uri = FileProvider.getUriForFile(this, "com.example.showinfo.fileprovider", yourDirectoryOfFiles);
intent.setData(uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

你的帖子比较陈旧。希望你能解决问题...但也许这会帮助其他人。 :)