Java 为什么我的应用程序出现不支持的URI内容错误?
我正在尝试编写一个Android应用程序,需要查询用户以选择一些数据文件所在的目录 当执行以下代码时,Android文件选择器启动,我选择一个目录 返回的URI在我看来是有效的: content://com.android.externalstorage.documents/tree/primary%3ANotifications 然后,当我查询内容提供者时,它崩溃了 返回的错误如下: 这是我的密码:Java 为什么我的应用程序出现不支持的URI内容错误?,java,android,Java,Android,我正在尝试编写一个Android应用程序,需要查询用户以选择一些数据文件所在的目录 当执行以下代码时,Android文件选择器启动,我选择一个目录 返回的URI在我看来是有效的: content://com.android.externalstorage.documents/tree/primary%3ANotifications 然后,当我查询内容提供者时,它崩溃了 返回的错误如下: 这是我的密码: package com.muddco.fptest2; import androidx.ap
package com.muddco.fptest2;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static String TAG = "TEST123";
public static TextView textView, uriView;
public Object act = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.view1);
uriView = (TextView) findViewById(R.id.uriview);;
showFileChooser();
}
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a Directory"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
Log.d(TAG, "File Uri: " + uri.toString());
uriView.setText("URI: "+ uri.toString());
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri, takeFlags);
ContentResolver contentResolver = getContentResolver();
String[] projection = { "*" };
Cursor cursor = contentResolver.query(uri,projection,null,null, null );
// We never get here - the query crashes with an Unsuported URI content error
if(cursor!=null) {
TextView pathView = (TextView) findViewById(R.id.pathView);
pathView.setText("URI: ");
cursor.moveToFirst();
// Loop in the cursor to get each row.
do {
// Get column 1 value.
int column1Index = cursor.getColumnIndex("column1");
String column1Value = cursor.getString(column1Index);
// Get column 2 value.
int column2Index = cursor.getColumnIndex("column2");
String column2Value = cursor.getString(column2Index);
pathView.setText(pathView.getText() + column1Value + " | " + column2Value + "\n");
} while (cursor.moveToNext());
}
//Toast.makeText(this, "File Uri: " + uri.toString(),
// Toast.LENGTH_LONG).show();
// Get the path
// Get the file instance
// File file = new File(path);
// Initiate the upload
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
我在清单中设置了以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
请原谅我糟糕的编码,因为我正在学习Android编程
任何关于如何使thw正确工作的建议都将不胜感激
谢谢 多亏了使用Commonware,我才成功地使事情运转起来 以下是工作代码:
package com.muddco.fl99;
import android.content.Context;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;;
import androidx.documentfile.provider.DocumentFile;
public class MainActivity extends AppCompatActivity {
static String TAG = "TEST123";
public static TextView fileView, uriView;
public Context act = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fileView = (TextView) findViewById(R.id.fileView);
uriView = (TextView) findViewById(R.id.uriView);;
showFileChooser();
}
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a Directory"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
Log.d(TAG, "File Uri: " + uri.toString());
uriView.setText("URI: "+ uri.toString());
DocumentFile dfile = DocumentFile.fromTreeUri(act, uri);
DocumentFile[] fileList = dfile.listFiles();
Log.d(TAG,fileList.toString() );
int jj=1;
for (DocumentFile docfile : fileList) {
Log.d(TAG, "File: " + docfile.getUri() + "\n");
}
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
这不是使用文档
Uri
的方式。您试图用该Uri
实现什么?我试图访问一个目录以获取它包含的文件列表。调用DocumentFile.fromTreeUri()
,传入您的树Uri
。调用DocumentFile
上的listFiles()
以获取该树的内容。我需要包括哪些内容才能识别DocumentFile类?不管怎样,我已经解决了。配置错误…您似乎完全抛弃了内容解析程序代码。SAF确实没有使用内容解析器,而且我们必须依赖于特殊的访问方法,如fromTreeUri()
?值得注意的是,for文档文件
特别指出,它是文档契约
的简化抽象,开销很大。如果可能,您应该只使用后者。要了解如何做到这一点,您可以查看DocumentFile
的实现,它非常简单。
package com.muddco.fl99;
import android.content.Context;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;;
import androidx.documentfile.provider.DocumentFile;
public class MainActivity extends AppCompatActivity {
static String TAG = "TEST123";
public static TextView fileView, uriView;
public Context act = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fileView = (TextView) findViewById(R.id.fileView);
uriView = (TextView) findViewById(R.id.uriView);;
showFileChooser();
}
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a Directory"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
Log.d(TAG, "File Uri: " + uri.toString());
uriView.setText("URI: "+ uri.toString());
DocumentFile dfile = DocumentFile.fromTreeUri(act, uri);
DocumentFile[] fileList = dfile.listFiles();
Log.d(TAG,fileList.toString() );
int jj=1;
for (DocumentFile docfile : fileList) {
Log.d(TAG, "File: " + docfile.getUri() + "\n");
}
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}