我在没有WRITE_EXTERNAL_PERMISION和READ_EXTERNAL_PERMISION的情况下成功地从图库或相机中获取图像
现在我想将该图像上传到 FTP 服务器
ImageSetter.kt
class ImageSetter(
private val activity: FragmentActivity,
private val imageView: ImageView,
val uriCallback:(uri:Uri?) -> Unit,
) : DefaultLifecycleObserver {
private lateinit var getContent: ActivityResultLauncher<String>
private lateinit var dispatchTakePicture: ActivityResultLauncher<Uri>
private val registry = activity.activityResultRegistry
private var uri: Uri? = null
override fun onCreate(owner: LifecycleOwner) {
getContent =
registry.register(
"select-key",
owner,
ActivityResultContracts.GetContent()
){
it?.let{
uriCallback.invoke(it)
this.uri = it
imageView.setImageURI(uri)
}
}
dispatchTakePicture =
registry.register(
"take-keys",
owner,
ActivityResultContracts.TakePicture()
){
if (it) {
Log.d("takePicture", "Success")
imageView.setImageURI(uri)
} else {
Log.d("takePicture", "Failed")
}
}
}
fun selectImage(){
val items = arrayOf("Select an image", "Take Photo")
AlertDialog.Builder(activity)
.setItems(items) { dialog, which ->
Log.d("dialog", dialog.toString())
Log.d("which", which.toString())
when(which){
0 -> getContent.launch("image/*")
1 -> takePicture()
}
}
.show()
}
private fun takePicture(){
val filename = UUID.randomUUID().toString() + ".jpg"
val path = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
val file = File(path, filename)
uri = FileProvider.getUriForFile(activity,
BuildConfig.APPLICATION_ID + ".provider", file);
uriCallback(uri)
dispatchTakePicture.launch(uri)
Log.d("Uri", uri.toString())
}
}
为了将图像文件上传到服务器,我需要InputStream但我无法获取原始图像文件以将其发布到服务器。
我需要任何许可才能这样做吗?
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var observer: ImageSetter
private lateinit var photoIv:ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
photoIv = findViewById(R.id.photoIv)
observer = ImageSetter(this, photoIv){ photoUri->
var openInputStream = contentResolver?.openInputStream(photoUri!!)
var format = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
var file = File(filesDir, "$format.jpg")
var fileoutputStream = FileOutputStream(file)
openInputStream?.copyTo(fileoutputStream)
openInputStream?.close()
fileoutputStream.close()
fileAbsolutPath = file.absolutePath
}
lifecycle.addObserver(observer)
observer.selectImage()
}
}
编辑
我有一个工作类将 fileInputStream 上传到具有方法的 FTP 服务器
public static boolean uploadImageFileOnFtpServer(FileInputStream inputStream, String clientFileName){
...
}
现在我只想弄清楚如何从 Ur i获取fileInputStream 。