2017-09-13 13 views
1

私のアプリケーションで撮影した画像のEXIFヘッダーにGoogleの位置情報を追加しようとしています。これまでのところ、fused location providerを使って位置を取得し、MainActivityでそれをトーストすることができました。しかし、スレッドで撮影した画像のEXIFヘッダーに位置データを書き込もうとすると、そこにLocationオブジェクトを取得できません。それは'Cannot resolve symbol 'location'を示しています。どんな助けもありがとうございます。シンボルを解決できません。画像のEXIFに位置情報を追加できません。

MainActivity.java

private TestThread myThread; 
private FusedLocationProviderClient mFusedLocationClient; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     getSupportActionBar().hide(); 
     setContentView(R.layout.activity_main); 

     System.loadLibrary("NativeImageProcessor"); 

     mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

     mFusedLocationClient.getLastLocation() 
       .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
        @Override 
        public void onSuccess(Location location) { 
         // Got last known location. In some rare situations this can be null. 
         if (location != null) { 
          // ... 
          double latitude = location.getLatitude(); 
          double longitude = location.getLongitude(); 
          Toast.makeText(MainActivity.this, "Latitude:" + latitude+", Longitude:"+longitude,Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 
       ... 
       ... 
      takePicture(); 

TestThread.java

.... 
    private void saveBitmap(String name, Bitmap bitmap, String timeStamp) { 
    File photo = CommonUtil.getFileName(timeStamp, name); 
    if (photo.exists()) photo.delete(); 
    try { 
     Bitmap image = applyBrightnessContrast(bitmap); 
     FileOutputStream fos = new FileOutputStream(photo.getPath()); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.close(); 
     CommonUtil.showProgressDialog(mContext, null, false); 
    } catch (java.io.IOException e) { 
     CommonUtil.showProgressDialog(mContext, null, false); 
     Log.e("PictureDemo", "Exception in photoCallback", e); 
    } 
    markGeoTagImage(photo.getPath(),location);// Here is the Error. 
} 

public static void markGeoTagImage(String imagePath,Location location) 
{ 
    try { 
     ExifInterface exif = new ExifInterface(imagePath); 
     exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, GPS.convert(location.getLatitude())); 
     exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, GPS.latitudeRef(location.getLatitude())); 
     exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, GPS.convert(location.getLongitude())); 
     exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, GPS.longitudeRef(location.getLongitude())); 
     SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
     exif.setAttribute(ExifInterface.TAG_DATETIME,fmt_Exif.format(new Date(location.getTime()))); 
     exif.saveAttributes(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

はグローバル属性にするonSuccessであなたの受信場所を渡ししようとしたようmarkGeoTagImage – MHP

+0

であなたのグローバル属性を使用「= nullの公共の静的な文字列;」アクティビティで?あなたがコードで説明するなら、それは素晴らしいことでしょう。 –

+0

私はあなたのための答えを投稿する、タイプの場所からオブジェクトを定義し、場所が受け取ったときonSuccessでそれを初期化する必要があります – MHP

答えて

1

mLocationのための新しいグローバル属性を定義し、それを受け取ったlocationを渡すと、このようにそれを使用します。

public static Location mLocation; // this is your location 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
try { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    getSupportActionBar().hide(); 
    setContentView(R.layout.activity_main); 

    System.loadLibrary("NativeImageProcessor"); 

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

    mFusedLocationClient.getLastLocation() 
      .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
       @Override 
       public void onSuccess(Location location) { 
        // Got last known location. In some rare situations this can be null. 
        if (location != null) { 
         mLocation = location; // we pass received location to our global location object 
         // ... 
         double latitude = location.getLatitude(); 
         double longitude = location.getLongitude(); 
         Toast.makeText(MainActivity.this, "Latitude:" + latitude+", Longitude:"+longitude,Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
      ... 
      ... 
     takePicture(); 

してから、このように、あなたのEXIFにmLocationを使用します。

private void saveBitmap(String name, Bitmap bitmap, String timeStamp) { 
    File photo = CommonUtil.getFileName(timeStamp, name); 
    if (photo.exists()) photo.delete(); 
    try { 
     Bitmap image = applyBrightnessContrast(bitmap); 
     FileOutputStream fos = new FileOutputStream(photo.getPath()); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     fos.close(); 
     CommonUtil.showProgressDialog(mContext, null, false); 
     } catch (java.io.IOException e) { 
     CommonUtil.showProgressDialog(mContext, null, false); 
     Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 
    if(mLocation != null)// check we have location or not 
    markGeoTagImage(photo.getPath(),mLocation); 
} 
+0

これはまだ解決していないことを示しています。私のスレッドは別のクラスにあります。 –

+0

これで解決方法をsaveBitmapに渡す – MHP

+1

問題が解決しました。私はちょうどそれを 'パブリック静的ロケーションの位置付け'にしました。それから、糸の中にそこに来ました。答えを更新してください。私は投票するつもりです。どうもありがとう 。 –