从SQLite数据库中检索图像(图像的文件路径)并在ImageView中显示它

时间:2015-01-08 13:46:08

标签: android sqlite google-maps

我今天早些时候提出这个问题,但我想我会尝试更详细地解释我的问题。

好的,我会尝试提供更多信息,尽可能解释我的问题。

因此,在我的应用中,用户可以点按地图上的任意点并添加自定义标记,因此当用户点击时,他们可以从相机意图中拍摄照片并将该图像返回到我customInfoWindow 。因此,当用户然后点击标记时,然后显示图像(缩略图),所有这些都有效但是一旦退出应用程序并且仍然显示返回标记,但图像不是。 所以我这样做是为了将图像添加到特定标记中:

private Map<String, Bitmap> myMarkersHash;
private String markerId;
.
.
.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_googlemaps);

myMarkersHash = new HashMap<String, Bitmap>();
.
.
.
@Override
public void onMapLongClick(final LatLng point) {

Marker marker = googleMap.addMarker(new MarkerOptions()
.title(title.getText().toString())
.snippet(snippet.getText().toString())
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
.position(point));
markerId = marker.getId();

Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Image");
imagesFolder.mkdirs();
image = new File(imagesFolder.getPath(), "MyImage_" + timeStamp + ".jpg");
fileUri = Uri.fromFile(image);
  imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(imageIntent, TAKE_PICTURE);

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {
 try {
  GetImageThumbnail getImageThumbnail = new GetImageThumbnail();
  bitmap = getImageThumbnail.getThumbnail(fileUri, this);
   } catch (FileNotFoundException e1) {
          e1.printStackTrace();
  } catch (IOException e1) {
           e1.printStackTrace();
  }

baos = new ByteArrayOutputStream();
  bitmap.compress(CompressFormat.PNG, 100, baos);
  imageData = baos.toByteArray();
myMarkersHash.put(markerId, bitmap);
  .
  .
  .
 @Override
    public View getInfoContents(Marker marker)
    {
 View v  = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
 ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon);
 Bitmap bitmap = myMarkersHash.get(marker.getId());
 markerIcon.setImageBitmap(bitmap);

所以上面的代码让我添加标记并向添加的标记显示正确的图像。然后我需要保存标记信息,以便当用户返回应用程序时,应显示标记:

 ContentValues contentValues = new ContentValues();
 contentValues.put(LocationsDB.FIELD_LAT, point.latitude);
 contentValues.put(LocationsDB.FIELD_LNG, point.longitude);
 contentValues.put(LocationsDB.FIELD_ZOOM, googleMap.getCameraPosition().zoom);
 contentValues.put(LocationsDB.FIELD_IMAGE, markerId);
 contentValues.put(LocationsDB.FIELD_FILEPATH, fileUri.toString());
 LocationInsertTask insertTask = new LocationInsertTask();
  insertTask.execute(contentValues)
 .
 .
 .
 private void drawMarker(LatLng point, byte[] id, byte[] filep) {
 Marker marker = googleMap.addMarker(new MarkerOptions()
 .title(title)
 .snippet(snippet)
 .position(thePoint));
 markerId = marker.getId();

然后在应用启动时加载数据:

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
int locationCount = 0;
double lat=0;
double lng=0;
float zoom=0;
byte [] id = null;
byte [] filep = null;
locationCount = arg1.getCount();
arg1.moveToFirst();

for(int i=0;i<locationCount;i++){

lat = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LAT));
lng = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LNG));
zoom = arg1.getFloat(arg1.getColumnIndex(LocationsDB.FIELD_ZOOM));
id = arg1.getBlob(arg1.getColumnIndex(LocationsDB.FIELD_IMAGE));
filep = arg1.getBlob(arg1.getColumnIndex(LocationsDB.FIELD_FILEPATH));
point = new LatLng(lat, lng);
drawMarker(point, title, id, filep);
arg1.moveToNext();
  }
if(locationCount>0){
 googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat,lng)));
 googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom));
 if(myMarkersHash.get(filep) != null & id != null){
 bitmap = BitmapFactory.decodeFile(image.getAbsolutePath());
 final ImageView markerIcon = (ImageView) findViewById(R.id.marker_icon);
 markerIcon.setImageBitmap(bitmap);
    }
  }
}

因此,您可以看到它保存标记和所有信息*但在应用重新启动后不会加载图像 *我知道它保存所有信息的原因是,当我访问我的数据库查看它时,我可以看到列和数据:

so for column 1 I have the ID of “1” then Column 2 I have the lat point of “xx.xxxx” and Column 3 the lng point of “xx.xxxx” and then Column 4 the zoom of “9” and then Column 5 the markerId of “m01” and the Column 6 I have “file:///storage/emulated/0/Image/MyImage_yyyymmdd_HHmmss.jpg”

因此,您可以看到它肯定会保存用图像加载标记所需的信息,但由于某种原因它不会。当应用程序再次启动时,我也没有收到错误消息或任何内容,所有标记都显示但没有图像。

我该怎么做才能解决这个问题? 我真的希望有人能够帮助我解决这个问题。 在此先感谢您的帮助。

修改

我现在尝试的是:

File imgFile = new  File("fileUri");
 if(imgFile.exists())
   {
  ImageView myImage = (ImageView) findViewById(R.id.marker_icon);
  myImage.setImageURI(Uri.fromFile(imgFile));

但仍然是一样的。

0 个答案:

没有答案