Everyone, I need to rename file before uploading to Firebase Storage with multiple image upload and encode to sha-1 (imagename + uid + current time):
915731b2094b1cb23c1b176ef8633947f737804b,fdf15718d6d988ce188bdc8debcb7d5998229db3
Multi Select Image i get from this link https://github.com/donglua/PhotoPicker
Mainboard Post Class (Class To Post to Firebase Storage and stamp to Firebase Database but now i don't have to put sha1hash to Firebase Database
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);
}
Mainboard Post Model
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;
}
}
答案 0 :(得分:2)
Below is a support class for creating a SHA-1 certificate. This maybe helpful for you .
1.Create a class
named SHA1Hash.java
and paste below code. Imports necessary package.
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. Use this call method as below to create SHA1 Certificate Using datetime and your necessary String value .
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 ;
}
Edited the uses method according your need . You can pass imageName+uid+currentTime
as String
as the method takes String
type of value
Your final code :
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 ;
}
Hope this is helpful for you. Thanks