我正在尝试使用Intent打开文件。操作\u获取\u类似于此帖子的内容:
Android打开一个文件与ACTION_GET_CONTENT结果到不同的Uri的
但是这里只是一个解决方案,如何使用不同的SDK/文件夹获取文件名,而不是不同的设备。获得Uri的意图也保持不变。
我想开门。png文件。
Uri.getPath()为两个设备(都. png文件存储在下载文件夹):
Samsung S3 Tablet (Android 8.0): /document/559
Samsung Galaxy S7 (Android 8.0): /document/raw:/storage/0/emulated/Download/Karte1.png
因此,问题是,如果我使用
getActivity().getContentResolver().openInputStream(uri)
它对平板电脑不起作用。
以下是意图代码片段:
public void browseClick() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/png");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent,
getString(R.string.choose_floorPlan)),REQUEST_CODE_OPEN_FILE);
} catch (Exception ex) {
System.out.println("browseClick :"+ex);
}
}
活动结果:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_CODE_OPEN_FILE) {
return;
}
if ((resultCode == RESULT_OK) && (data != null)) {
try {
selectedMap = data.getData();
String filename = FileHelper.getUriName(selectedMap,
getActivity());
textMapDir.setText(getString(R.string.placeholder_
folder_begin, filename));
textMapDir.setText(selectedMap.getPath());
} catch (Exception e) {
e.printStackTrace();
}
}
}
在此方法中,im使用uri和openInputStream(uri)
private boolean createFiles(String pathProjectDir, Uri selectedMap) {
if (!ExistsDir(pathProjectDir)) { //it should be possible to add more floors/buildings to an existing project
if (getAndCreateDir(pathProjectDir).exists()) {
InputStream excelFile;
InputStream mapFile;
try {
excelFile = Objects.requireNonNull(getActivity()).getAssets().open(EXCEL_FILE_NAME);
mapFile = getActivity().getContentResolver().openInputStream(selectedMap);
if (FileHelper.getMimeType(selectedMap.getPath()).equals("application/pdf")) {
// some code
} else if (FileHelper.getMimeType(selectedMap.getPath()).equals("image/png")) {
if ((copyFile(excelFile, getExcelPath(pathProjectDir)))
&& (copyFile(mapFile, getMapPathPNG(pathProjectDir)))) {
return true;
}
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(), getString(R.string.excel_file_unable_to_create), Toast.LENGTH_LONG).show();
return false;
}
}
Toast.makeText(getActivity(), getString(R.string.project_dir_was_not_created), Toast.LENGTH_LONG).show();
return false;
}
Toast.makeText(getActivity(), getString(R.string.project_dir_exisitng), Toast.LENGTH_LONG).show();
return false;
}
这是getMimeType()方法,我从uri中检查MIME,这可能是问题所在:
public static String getMimeType(String path) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(path);
if (extension != null) {
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
这是copyFile()方法,我在其中复制InputStream:
public static Boolean copyFile(InputStream isFile, String pathOutput) {
try {
FileOutputStream fos = new FileOutputStream(new File(pathOutput));
copyFileBuffer(isFile, fos);
isFile.close();
fos.flush();
fos.close();
return true;
} catch (IOException io) {
io.printStackTrace();
}
return false;
}
要完成代码,这里有copyFileBuffer()方法,但这应该可以:
public static Boolean copyFile(InputStream isFile, String pathOutput) {
try {
FileOutputStream fos = new FileOutputStream(new File(pathOutput));
copyFileBuffer(isFile, fos);
isFile.close();
fos.flush();
fos.close();
return true;
} catch (IOException io) {
io.printStackTrace();
}
return false;
}
你必须从uri那里得到真正的路径。下面是它的代码。我从堆栈溢出的帖子中找到了它,但我没有链接到它。所以功劳归于发布它的人。通过上下文和uri,得到真正的路径
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static String getPathFromUri(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
代码: 这就是我初始化相机的方式。 I',试图获得设备的分辨率,并在此基础上设置相机的宽度和高度。 问题是。 我认为精灵不会在更高分辨率的设备上缩放。 根据我的知识和引擎本机缩放相机和精灵。 那么为什么精灵在这种情况下不会被缩放呢? 我应该如何根据分辨率放大精灵? 我也试过FillResolutionPolicy。同样的事情。 我用的是TexturePackerExtension of anden
问题内容: 当要依赖的测试与具有此批注的测试属于同一类时,批注的属性可以正常工作。但是,如果要测试的方法和依赖的方法位于不同的类中,则该方法不起作用。示例如下: 有什么办法可以解决这个限制?一种简单的解决方法是在该调用中创建测试。但这将是过多的重复。 问题答案: 将方法放在中并使用。 建议验证*中的配置,并在该处出现问题时抛出错误,以使测试无法运行。这样,测试可以只关注测试。
我创建了一个如图所示的按钮布局设计。如何实现不同尺寸屏幕的设计模式?这种布局适合3.7英寸屏幕,但不适合其他屏幕。可能是scrollview是一个选项,但这并不满足我。我怎么能做到呢?有什么帮助吗? 这是我的xml文件
我的要求是既不显示相机预览,也不使用图像捕捉相机的意图。 在那里,我找到了一种适用于我的第一台测试设备(Galaxy tab 7)的方法。 我的功能如下所示 和< code>getCameraID功能如下 现在我面临着在不同设备上成功运行上述代码的困难。 三星Galaxy S(2.3.6):前置摄像头始终返回绿色图像,但编码后置摄像头工作正常。 三星Galaxy Nexus (4.1):编码不适用
我有一个场景,我已经在不同的节点上部署了4个Kafka消费者实例。我的主题有4个分区。现在,我想配置消费者,使他们都从主题的不同分区获取。 我知道一个事实,如果消费者来自同一个消费者组,他们会确保分区被平分。但在我的情况下,他们不在同一组。
Firebase A/B测试是否考虑由设置的用户id?下面是我的用例: 打开应用程序 他签入 用调用 获取远程配置值->他登陆 在其他设备(相同的Google帐户)上打开应用程序 他签入 用调用 获取远程配置值->是否保证他将登陆? 对A/B测试有意义吗?