0

모두, 나는 SHA-1(참고 ImageName UID + 현재 시간 +)에 여러 이미지 업로드 및 인코딩과 중포 기지 저장 에 업로드하기 전에 파일의 이름을 변경해야합니다 :안드로이드 - 중포 기지가 파일의 이름을 변경 (SHA-1) 업로드하기 전에

915731b2094b1cb23c1b176ef8633947f737804b, fdf15718d6d988ce188bdc8debcb7d5998229db3 내가이 링크 https://github.com/donglua/PhotoPicker

에서 얻을

멀티 이미지 선택개

메인 보드 포스트 클래스 (클래스 중포 기지 데이터베이스에 중포 기지 저장 및 스탬프에 게시하지만 지금은 중포 기지 데이터베이스에

public String mb_address; 
public String mb_body; 
public String mb_location; 
public String mb_pic; 
public String mb_title ; 

public PostMainboard(){ 

} 

public PostMainboard(String mb_title ,String mb_body,String mb_location,String mb_address , String mb_pic) 

{ 
    this.mb_address = mb_address; 
    this.mb_body = mb_body; 
    this.mb_location = mb_location; 
    this.mb_pic = mb_pic; 
    this.mb_title = mb_title; 
} 

@Exclude 
public Map<String , Object> toMap(){ 
    HashMap<String, Object> result = new HashMap<>(); 
    result.put("mb_title" , mb_title); 
    result.put("mb_body" , mb_body); 
    result.put("mb_location" , mb_location); 
    result.put("mb_address" , mb_address); 
    result.put("mb_pic" , mb_pic); 
    return result; 
} 

}

private static final String TAG = "MainboardPost"; 
private static final int MAP_REQUEST_CODE = 334; 
private static final int ADD_PHOTO_REQUEST = 335; 
private Toolbar toolbar; 
private TextView cancle; 
private Mainboard post; 
private PhotoAdapter photoAdapter; 
private ArrayList<String> selectedPhotos = new ArrayList<>(); 
Button img_btn,map_btn,removeMapBtn; 
RelativeLayout layout_img , layout_map ; 
private RecyclerView recyclerView; 
EditText header , body; 

private UploadTask mUploadtask; 

ImageButton addMapBtn; 
FrameLayout frameLayout; 

private FirebaseStorage storageRef; 
private StorageReference mStorage , folderRef; 
private DatabaseReference mDatabase; 

// รับค่าlat lon เพื่อโพส 
private String loc_latlon; 
private String loc_address; 

private FirebaseAuth mAuth; 

GoogleMap map; 
Marker mMarker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_mainbard_post); 
    toolbar = (Toolbar) findViewById(R.id.toolbar_post); //Custom toolbar 
    setSupportActionBar(toolbar); // Class Actionbar ให้ใช้ Toolbar แทนของระบบ 
    getSupportActionBar().setDisplayShowTitleEnabled(false); // ซ่อนชื่อแอพบน Toolbar 


    mAuth = FirebaseAuth.getInstance(); 

    mDatabase = FirebaseDatabase.getInstance().getReference(); 

    storageRef = FirebaseStorage.getInstance(); 
    mStorage = storageRef.getReference(); 
    folderRef = mStorage.child("mainboard"); 


    frameLayout = (FrameLayout)findViewById(R.id.map_frame); 
    removeMapBtn = (Button)findViewById(R.id.remove_btn); 
    addMapBtn = (ImageButton)findViewById(R.id.addmap_btn); 
    layout_img = (RelativeLayout)findViewById(R.id.layout_add_photo); 
    layout_map = (RelativeLayout)findViewById(R.id.layout_add_map); 
    recyclerView = (RecyclerView)findViewById(R.id.addimg_view); 
    header = (EditText)findViewById(R.id.topic); 
    body = (EditText)findViewById(R.id.detail); 
    photoAdapter = new PhotoAdapter(MainboardPost.this, selectedPhotos); 

    img_btn = (Button)findViewById(R.id.add_img); 
    img_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      layout_img.setVisibility(View.VISIBLE); 
      layout_map.setVisibility(View.GONE); 
     } 
    }); 
    map_btn = (Button)findViewById(R.id.add_map); 
    map_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      layout_map.setVisibility(View.VISIBLE); 
      layout_img.setVisibility(View.GONE); 

     } 
    }); 

    cancle = (TextView) findViewById(R.id.toolbar_cancle); 
    cancle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 


    addMapBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainboardPost.this, MapsActivity.class); 
      startActivityForResult(intent, MAP_REQUEST_CODE); 
     } 
    }); 

    removeMapBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      frameLayout.setVisibility(View.GONE); 
      addMapBtn.setVisibility(View.VISIBLE); 
     } 
    }); 

    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, OrientationHelper.VERTICAL)); 
    recyclerView.setAdapter(photoAdapter); 

    recyclerView.addOnItemTouchListener(new RecyclerItemClick(MainboardPost.this, 
      new RecyclerItemClick.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        if (photoAdapter.getItemViewType(position) == PhotoAdapter.TYPE_ADD) { 
         PhotoPicker.builder() 
           .setPhotoCount(PhotoAdapter.MAX) 
           .setShowCamera(true) 
           .setPreviewEnabled(false) 
           .setSelected(selectedPhotos) 
           .start(MainboardPost.this, REQUEST_CODE); 
        } else { 
         PhotoPreview.builder() 
           .setPhotos(selectedPhotos) 
           .setCurrentItem(position) 
           .start(MainboardPost.this, REQUEST_CODE); 
        } 
       } 
      })); 

    setUpGoogleMap(); 

} 

//Menu Item ขวามือสุดของ Toolbar 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_post, menu); 
    return true; 
} 

private void setUpGoogleMap() { 
    if (new GooglePlayServiceCheck().isGooglePlayInstalled(MainboardPost.this)) { 

     SupportMapFragment map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView2)); 
     map.getMapAsync(this);//after getting map call async method, this method will call onMapReady(GoogleMap map) method 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
     case MAP_REQUEST_CODE: 
      if (resultCode == Activity.RESULT_OK) { 
       //Location Fetched 
       double lat = data.getDoubleExtra("location_lat", 0); 
       double lng = data.getDoubleExtra("location_lng", 0); 

       loc_latlon = lat + "," + lng; 

       Log.e("Selected Lat-lng", lat + " - " + lng); 
       frameLayout.setVisibility(View.VISIBLE); 
       addMapBtn.setVisibility(View.GONE); 
       //Here after getting lat lng add marker to ur google map using fetched lat lng 
       setPickedLocationOverMap(lat, lng); 
       // 
      } 
      break; 
     case REQUEST_CODE: 
      if (resultCode == RESULT_OK && 
        (requestCode == REQUEST_CODE || requestCode == PhotoPreview.REQUEST_CODE)) { 
       List<String> photos = null; 
       if (data != null) { 
        photos = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS); 
       } 
       selectedPhotos.clear(); 

       if (photos != null) { 

        selectedPhotos.addAll(photos); 
       } 
       photoAdapter.notifyDataSetChanged(); 
      } 
      break; 
    } 
} 

private void setPickedLocationOverMap(double lat, double lng) { 
    // Needs to call MapsInitializer before doing any CameraUpdateFactory calls 
    MapsInitializer.initialize(this.getApplicationContext()); 
    // Updates the location and zoom of the MapView 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 17); 
    if (map != null) 
     map.animateCamera(cameraUpdate); 

} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    this.map = googleMap; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    submitPost(); 
    return true; 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.button_upload_resume: 
      Helper.mProgressDialog.show(); 
      mUploadtask.resume(); 
      break; 
    } 
} 

private void submitPost() { 


    final String title = header.getText().toString().trim(); 
    final String detail = body.getText().toString().trim(); 

    if (loc_latlon == null){ 
     loc_latlon = ""; 
    } 

    if (loc_address == null){ 
     loc_address = ""; 
    } 

    if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(detail)){ 
     final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
     mDatabase.child("user").child(userId).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       User user = dataSnapshot.getValue(User.class); 
       if (user == null){ 
        Log.e(TAG, "User " + userId + " is unexpectedly null"); 
        Toast.makeText(MainboardPost.this, 
          "Error: could not fetch user.", 
          Toast.LENGTH_SHORT).show(); 

       }else { 
        writenewpost(title , detail , loc_latlon , loc_address); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
      } 
     }); 
    } 
    for (String imagePath : selectedPhotos){ 
     Uri file = Uri.fromFile(new File(imagePath)); 
     StorageReference imageRef = folderRef.child(file.getLastPathSegment()); 
     mUploadtask = imageRef.putFile(file); 

    } 

} 

private void writenewpost(String mbTitle , String mbBody, String mbLocation , String mbAddress) 

{ 

    String key = mDatabase.child("mainboard").push().getKey(); 
    PostMainboard mainboard_post = new PostMainboard(mbTitle, mbBody , mbLocation , mbAddress); 

    Map<String, Object>postvalue = mainboard_post.toMap(); 
    Map<String, Object>childUpdates = new HashMap<>(); 
    childUpdates.put("/mainboard/" + key , postvalue); 

    mDatabase.updateChildren(childUpdates); 
} 

메인 보드 포스트 모델 sha1hash를 넣을 필요가 없습니다

답변

2

다음은 SHA-1 인증서를 만들기위한 지원 클래스입니다. 이것은 아마도 당신에게 도움이 될 것입니다.

SHA1Hash.java이라는 이름의 class을 작성하고 아래 코드를 붙여 넣으십시오. 필요한 패키지를 가져옵니다.

public class SHA1Hash { 

    private static String convertToHex(byte[] data) { 
     StringBuilder buf = new StringBuilder(); 
     for (byte b : data) { 
      int halfbyte = (b >>> 4) & 0x0F; 
      int two_halfs = 0; 
      do { 
       buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte) : (char) ('a' + (halfbyte - 10))); 
       halfbyte = b & 0x0F; 
      } while (two_halfs++ < 1); 
     } 
     return buf.toString(); 
    } 

    public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { 
     MessageDigest md = MessageDigest.getInstance("SHA-1"); 
     md.update(text.getBytes("iso-8859-1"), 0, text.length()); 
     byte[] sha1hash = md.digest(); 
     return convertToHex(sha1hash); 
    } 
} 

2. 다음과 같이이 호출 방법은 날짜를 사용하여 SHA1 인증서 및 필요한 문자열 값을 만들 수 있습니다.

 public static String getDateTimeHash(String uid, String imageName){ 
      final String HASH_KEY = uid+imageName; 
      String hashString = ""; 
      String timeInMilliSeconds = String.valueOf(System.currentTimeMillis()); 
      try { 
       hashString = SHA1Hash.SHA1(timeInMilliSeconds.concat(HASH_KEY)); 
      } catch (NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Utils","Hash Value is "+hashString); 
      return hashString ; 
     } 

은 당신의 필요에 따라 사용 방법을 편집. 이 방법은 값의 String 유형을 필요로 당신은 StringimageName+uid+currentTime 통과 할 수

귀하의 최종 코드 :이 당신을 위해 도움이됩니다

private static final String TAG = "MainboardPost"; 
private static final int MAP_REQUEST_CODE = 334; 
private static final int ADD_PHOTO_REQUEST = 335; 
private Toolbar toolbar; 
private TextView cancle; 
private Mainboard post; 
private PhotoAdapter photoAdapter; 
private ArrayList<String> selectedPhotos = new ArrayList<>(); 
Button img_btn,map_btn,removeMapBtn; 
RelativeLayout layout_img , layout_map ; 
private RecyclerView recyclerView; 
EditText header , body; 

private UploadTask mUploadtask; 

ImageButton addMapBtn; 
FrameLayout frameLayout; 

private FirebaseStorage storageRef; 
private StorageReference mStorage , folderRef; 
private DatabaseReference mDatabase; 

// รับค่าlat lon เพื่อโพส 
private String loc_latlon; 
private String loc_address; 

private FirebaseAuth mAuth; 

GoogleMap map; 
Marker mMarker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_mainbard_post); 
    toolbar = (Toolbar) findViewById(R.id.toolbar_post); //Custom toolbar 
    setSupportActionBar(toolbar); // Class Actionbar ให้ใช้ Toolbar แทนของระบบ 
    getSupportActionBar().setDisplayShowTitleEnabled(false); // ซ่อนชื่อแอพบน Toolbar 


    mAuth = FirebaseAuth.getInstance(); 

    mDatabase = FirebaseDatabase.getInstance().getReference(); 

    storageRef = FirebaseStorage.getInstance(); 
    mStorage = storageRef.getReference(); 
    folderRef = mStorage.child("mainboard"); 


    frameLayout = (FrameLayout)findViewById(R.id.map_frame); 
    removeMapBtn = (Button)findViewById(R.id.remove_btn); 
    addMapBtn = (ImageButton)findViewById(R.id.addmap_btn); 
    layout_img = (RelativeLayout)findViewById(R.id.layout_add_photo); 
    layout_map = (RelativeLayout)findViewById(R.id.layout_add_map); 
    recyclerView = (RecyclerView)findViewById(R.id.addimg_view); 
    header = (EditText)findViewById(R.id.topic); 
    body = (EditText)findViewById(R.id.detail); 
    photoAdapter = new PhotoAdapter(MainboardPost.this, selectedPhotos); 

    img_btn = (Button)findViewById(R.id.add_img); 
    img_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      layout_img.setVisibility(View.VISIBLE); 
      layout_map.setVisibility(View.GONE); 
     } 
    }); 
    map_btn = (Button)findViewById(R.id.add_map); 
    map_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      layout_map.setVisibility(View.VISIBLE); 
      layout_img.setVisibility(View.GONE); 

     } 
    }); 

    cancle = (TextView) findViewById(R.id.toolbar_cancle); 
    cancle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 


    addMapBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainboardPost.this, MapsActivity.class); 
      startActivityForResult(intent, MAP_REQUEST_CODE); 
     } 
    }); 

    removeMapBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      frameLayout.setVisibility(View.GONE); 
      addMapBtn.setVisibility(View.VISIBLE); 
     } 
    }); 

    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, OrientationHelper.VERTICAL)); 
    recyclerView.setAdapter(photoAdapter); 

    recyclerView.addOnItemTouchListener(new RecyclerItemClick(MainboardPost.this, 
      new RecyclerItemClick.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        if (photoAdapter.getItemViewType(position) == PhotoAdapter.TYPE_ADD) { 
         PhotoPicker.builder() 
           .setPhotoCount(PhotoAdapter.MAX) 
           .setShowCamera(true) 
           .setPreviewEnabled(false) 
           .setSelected(selectedPhotos) 
           .start(MainboardPost.this, REQUEST_CODE); 
        } else { 
         PhotoPreview.builder() 
           .setPhotos(selectedPhotos) 
           .setCurrentItem(position) 
           .start(MainboardPost.this, REQUEST_CODE); 
        } 
       } 
      })); 

    setUpGoogleMap(); 

} 

//Menu Item ขวามือสุดของ Toolbar 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_post, menu); 
    return true; 
} 

private void setUpGoogleMap() { 
    if (new GooglePlayServiceCheck().isGooglePlayInstalled(MainboardPost.this)) { 

     SupportMapFragment map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView2)); 
     map.getMapAsync(this);//after getting map call async method, this method will call onMapReady(GoogleMap map) method 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
     case MAP_REQUEST_CODE: 
      if (resultCode == Activity.RESULT_OK) { 
       //Location Fetched 
       double lat = data.getDoubleExtra("location_lat", 0); 
       double lng = data.getDoubleExtra("location_lng", 0); 

       loc_latlon = lat + "," + lng; 

       Log.e("Selected Lat-lng", lat + " - " + lng); 
       frameLayout.setVisibility(View.VISIBLE); 
       addMapBtn.setVisibility(View.GONE); 
       //Here after getting lat lng add marker to ur google map using fetched lat lng 
       setPickedLocationOverMap(lat, lng); 
       // 
      } 
      break; 
     case REQUEST_CODE: 
      if (resultCode == RESULT_OK && 
        (requestCode == REQUEST_CODE || requestCode == PhotoPreview.REQUEST_CODE)) { 
       List<String> photos = null; 
       if (data != null) { 
        photos = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS); 
       } 
       selectedPhotos.clear(); 

       if (photos != null) { 

        selectedPhotos.addAll(photos); 
       } 
       photoAdapter.notifyDataSetChanged(); 
      } 
      break; 
    } 
} 

private void setPickedLocationOverMap(double lat, double lng) { 
    // Needs to call MapsInitializer before doing any CameraUpdateFactory calls 
    MapsInitializer.initialize(this.getApplicationContext()); 
    // Updates the location and zoom of the MapView 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 17); 
    if (map != null) 
     map.animateCamera(cameraUpdate); 

} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    this.map = googleMap; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    submitPost(); 
    return true; 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.button_upload_resume: 
      Helper.mProgressDialog.show(); 
      mUploadtask.resume(); 
      break; 
    } 
} 

private void submitPost() { 


    final String title = header.getText().toString().trim(); 
    final String detail = body.getText().toString().trim(); 
final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid(); 

    if (loc_latlon == null){ 
     loc_latlon = ""; 
    } 

    if (loc_address == null){ 
     loc_address = ""; 
    } 

    if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(detail)){ 

     mDatabase.child("user").child(userId).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       User user = dataSnapshot.getValue(User.class); 
       if (user == null){ 
        Log.e(TAG, "User " + userId + " is unexpectedly null"); 
        Toast.makeText(MainboardPost.this, 
          "Error: could not fetch user.", 
          Toast.LENGTH_SHORT).show(); 

       }else { 
        writenewpost(title , detail , loc_latlon , loc_address); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
      } 
     }); 
    } 
    for (String imagePath : selectedPhotos){ 
     Uri file = Uri.fromFile(new File(imagePath)); 
     String imageName=imagePath.substring(imagePath.lastIndexOf("/")+1); 
     Log.d("ImageName" , imageName) ; 
     String hashImageName = getDateTimeHash(userId, imageName); 
     Log.d("HashImageName" , hashImageName); 
     StorageReference imageRef = folderRef.child(hashImageName); 
     mUploadtask = imageRef.putFile(file); 

    } 

} 

private void writenewpost(String mbTitle , String mbBody, String mbLocation , String mbAddress) 

{ 

    String key = mDatabase.child("mainboard").push().getKey(); 
    PostMainboard mainboard_post = new PostMainboard(mbTitle, mbBody , mbLocation , mbAddress); 

    Map<String, Object>postvalue = mainboard_post.toMap(); 
    Map<String, Object>childUpdates = new HashMap<>(); 
    childUpdates.put("/mainboard/" + key , postvalue); 

    mDatabase.updateChildren(childUpdates); 
} 

public static String getDateTimeHash(String uid, String imageName){ 
      final String HASH_KEY = uid+imageName; 
      String hashString = ""; 
      String timeInMilliSeconds = String.valueOf(System.currentTimeMillis()); 
      try { 
       hashString = SHA1Hash.SHA1(timeInMilliSeconds.concat(HASH_KEY)); 
      } catch (NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Utils","Hash Value is "+hashString); 
      return hashString ; 
     } 

희망. 감사합니다

+0

답장을 보내 주셔서 감사합니다하지만 난 내가 클래스를 만들이위한 초보자이야하고 –

+0

이 확인 나 코드를 확인하고 당신을 위해 참고 ImageName 및 UID를하자 내가 어떻게 내 코드에서 사용할 수 있습니다. @ C.Junior 어디에서 얻을 수 있습니다 imageName & uid 클래스입니다. –

+0

함수 매개 변수를 편집했습니다. 이제 uid와 imageName을 전달하여이 메서드를 사용하면 sha1 키가 String으로 반환됩니다. 원하는 모든 수업이나 활동에서이 기능을 사용할 수 있습니다. –

관련 문제