Android: 将URI从一个activity发送到另一个,然后在ImageView中显示
Android: Send URI from one activity to another and then display it in ImageView
我正在使用 OpenCV 开发一个应用程序,目前如果相机识别文档中的某些文本区域,它会将它们转换为字符串,它还会从每个文本区域的相机框架中提取裁剪图像并将其存储到一个临时目录。
我知道这些图像的文件路径,我尝试将它们提取到我的 camera_activity 中的单独 URI 字符串中,然后将它们与 Intent 一起传递给另一个 activity,在那里它们应该从字符串重新转换为URI 然后作为图像显示到 ImageView 中。到目前为止,这是我的代码:
camera_activity 使用 OpenCV JavaCamera 视图:
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
OcrResponse resp = ocr.ExtractUserIdData(mRgba, false);
if (resp.ok) {
ArrayList<String> strings = new ArrayList<>();
ArrayList<String> uriStrings = new ArrayList<>();
ArrayList<Uri> uriArray = new ArrayList<>();
Uri uri;
String uriStr;
Intent intent = new Intent(this, activity_output.class);
for (Response_data data : resp.data) {
System.out.println(data.header + ": " + data.details.trim());
strings.add(data.header + ": " + data.details);
uri = Uri.fromFile(new File("dir/" + data.header.replace(' ', '_') + ".png"));
uriStr = uri.toString();
uriStrings.add(uriStr);
}
intent.putStringArrayListExtra("string1", strings);
intent.putStringArrayListExtra("uri_img", uriStrings);
startActivity(intent);
[...]
}
}
稍微解释一下这段代码。 OCR 识别文档中的某些文本区域并将它们提取为字符串(格式为 "Headers: Description")。 for 语句就是这样做的,将它们添加到一个名为 strings 的字符串数组中,然后将该数组发送到一个名为 activity 的新 activity 中。 =35=]output_activity 通过 Intent 和 .putStringArrayListExtra。到目前为止,一切都很好。
这是 output_activity 的代码:
public class activity_output extends AppCompatActivity {
TextView text;
ImageView iv;
ArrayList<String> arraylist = new ArrayList<>();
ArrayList<String> arraylistUri = new ArrayList<>();
ArrayList<Uri> uri = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_output);
text = findViewById(R.id.output_text1);
iv = findViewById(R.id.img_out);
arraylist = getIntent().getStringArrayListExtra("string1");
arraylistUri = getIntent().getStringArrayListExtra("uri_img");
//uri = (ArrayList<Uri>) getIntent().getSerializableExtra("img");
StringBuilder builder = new StringBuilder();
StringBuilder builderU = new StringBuilder();
//StringBuilder uriBuilder = new StringBuilder();
for (String s : arraylist) {
builder.append(s).append("\n\n");
}
for (String d : arraylistUri) {
builderU.append(d);
}
text.setText(builder.toString());
//iv.setImageURI(Uri.parse(uriBuilder.toString()));
在这里,我接收到字符串数组并将其转换为 TextView。一切正常,所有正确的数据都写在 activity 中。毫无疑问我的代码到目前为止有效。这是屏幕截图:A little more work on the layout, but functionally it's good
现在,回到 camera_activity,您可以看到在 for 语句中,我试图从每个裁剪片段的图像路径中获取 URI (在 'uri' 变量内),然后将其转换为名为 'uriStr' 的字符串。然后我将每个字符串添加到另一个名为 'UriStrings' 的数组列表并将其发送到 output_activity.
我的问题终于来了:我究竟如何使用包含 output_activity 中的 URI 的字符串,以便我可以在 ImageView 中显示那些裁剪后的图像?我使用的方法不起作用(不出所料),我需要一个快速的解决方案。
谢谢你,愿你的道路通向温暖的沙滩!
我实际上找到了绕过 URI 的方法。如果有人感兴趣,这是我找到的解决方案:
我没有再从我的 camera_activity 发送任何东西,只使用 output_activity.
File mFile = new
File("/data/user/0/com.blissk.myapplication/cacheExtractedSerialNumber.png");
Bitmap mBitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
Bitmap MBitmap = Bitmap.createScaledBitmap(mBitmap,(int)(mBitmap.getWidth()*4),(int)(mBitmap.getHeight()*4),true);
ImageView iv = findViewById(R.id.img_out);
iv.setImageBitmap(MBitmap);
我目前是 Java 中的一个虚拟人,因为该应用程序应该在您退出相机视图后销毁所有扫描的文档(出于隐私原因),我认为缓存图像的路径在切换后将不起作用到 output_activity 并认为它们需要通过 Intent 发送到那里。他们确实工作了,程序在 output_activity 完成后成功销毁了所有数据()。
基本上我上面的代码适用于任何使用缓存图像的应用程序,将它们转换为位图,调整它们的大小(在我的例子中我需要将它们放大 4 倍)并显示它们
我正在使用 OpenCV 开发一个应用程序,目前如果相机识别文档中的某些文本区域,它会将它们转换为字符串,它还会从每个文本区域的相机框架中提取裁剪图像并将其存储到一个临时目录。
我知道这些图像的文件路径,我尝试将它们提取到我的 camera_activity 中的单独 URI 字符串中,然后将它们与 Intent 一起传递给另一个 activity,在那里它们应该从字符串重新转换为URI 然后作为图像显示到 ImageView 中。到目前为止,这是我的代码:
camera_activity 使用 OpenCV JavaCamera 视图:
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
OcrResponse resp = ocr.ExtractUserIdData(mRgba, false);
if (resp.ok) {
ArrayList<String> strings = new ArrayList<>();
ArrayList<String> uriStrings = new ArrayList<>();
ArrayList<Uri> uriArray = new ArrayList<>();
Uri uri;
String uriStr;
Intent intent = new Intent(this, activity_output.class);
for (Response_data data : resp.data) {
System.out.println(data.header + ": " + data.details.trim());
strings.add(data.header + ": " + data.details);
uri = Uri.fromFile(new File("dir/" + data.header.replace(' ', '_') + ".png"));
uriStr = uri.toString();
uriStrings.add(uriStr);
}
intent.putStringArrayListExtra("string1", strings);
intent.putStringArrayListExtra("uri_img", uriStrings);
startActivity(intent);
[...]
}
}
稍微解释一下这段代码。 OCR 识别文档中的某些文本区域并将它们提取为字符串(格式为 "Headers: Description")。 for 语句就是这样做的,将它们添加到一个名为 strings 的字符串数组中,然后将该数组发送到一个名为 activity 的新 activity 中。 =35=]output_activity 通过 Intent 和 .putStringArrayListExtra。到目前为止,一切都很好。
这是 output_activity 的代码:
public class activity_output extends AppCompatActivity {
TextView text;
ImageView iv;
ArrayList<String> arraylist = new ArrayList<>();
ArrayList<String> arraylistUri = new ArrayList<>();
ArrayList<Uri> uri = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_output);
text = findViewById(R.id.output_text1);
iv = findViewById(R.id.img_out);
arraylist = getIntent().getStringArrayListExtra("string1");
arraylistUri = getIntent().getStringArrayListExtra("uri_img");
//uri = (ArrayList<Uri>) getIntent().getSerializableExtra("img");
StringBuilder builder = new StringBuilder();
StringBuilder builderU = new StringBuilder();
//StringBuilder uriBuilder = new StringBuilder();
for (String s : arraylist) {
builder.append(s).append("\n\n");
}
for (String d : arraylistUri) {
builderU.append(d);
}
text.setText(builder.toString());
//iv.setImageURI(Uri.parse(uriBuilder.toString()));
在这里,我接收到字符串数组并将其转换为 TextView。一切正常,所有正确的数据都写在 activity 中。毫无疑问我的代码到目前为止有效。这是屏幕截图:A little more work on the layout, but functionally it's good
现在,回到 camera_activity,您可以看到在 for 语句中,我试图从每个裁剪片段的图像路径中获取 URI (在 'uri' 变量内),然后将其转换为名为 'uriStr' 的字符串。然后我将每个字符串添加到另一个名为 'UriStrings' 的数组列表并将其发送到 output_activity.
我的问题终于来了:我究竟如何使用包含 output_activity 中的 URI 的字符串,以便我可以在 ImageView 中显示那些裁剪后的图像?我使用的方法不起作用(不出所料),我需要一个快速的解决方案。
谢谢你,愿你的道路通向温暖的沙滩!
我实际上找到了绕过 URI 的方法。如果有人感兴趣,这是我找到的解决方案:
我没有再从我的 camera_activity 发送任何东西,只使用 output_activity.
File mFile = new
File("/data/user/0/com.blissk.myapplication/cacheExtractedSerialNumber.png");
Bitmap mBitmap = BitmapFactory.decodeFile(mFile.getAbsolutePath());
Bitmap MBitmap = Bitmap.createScaledBitmap(mBitmap,(int)(mBitmap.getWidth()*4),(int)(mBitmap.getHeight()*4),true);
ImageView iv = findViewById(R.id.img_out);
iv.setImageBitmap(MBitmap);
我目前是 Java 中的一个虚拟人,因为该应用程序应该在您退出相机视图后销毁所有扫描的文档(出于隐私原因),我认为缓存图像的路径在切换后将不起作用到 output_activity 并认为它们需要通过 Intent 发送到那里。他们确实工作了,程序在 output_activity 完成后成功销毁了所有数据()。
基本上我上面的代码适用于任何使用缓存图像的应用程序,将它们转换为位图,调整它们的大小(在我的例子中我需要将它们放大 4 倍)并显示它们