首相一定要注意處理權(quán)限問題
1.在AndroidManifest.xml(清單文件) 給的訪問權(quán)限。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
//與activity 平級(jí)
<provider
android:authorities="com.baidu.upload.provider"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
//xml/file_paths 在res創(chuàng)建 中創(chuàng)建xml文件包 在其中起名file_paths就可以 ,file_paths中內(nèi)容
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path
name="upload"
path="" />
</paths>
2.在Java代碼中給相機(jī)的運(yùn)行時(shí)權(quán)限
//1例如button觸發(fā)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
takePhoto();
break;
case R.id.btn2:
takePICK();
break;
}
//相冊(cè)的運(yùn)行時(shí)權(quán)限
private void takePICK() {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
openAlbum();//打開相冊(cè)方法
}else{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
}
}
//相機(jī)的運(yùn)行時(shí)權(quán)限
private void takePhoto() {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){
openCamera();
}else{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},100);
}
}
//這是回調(diào)得到的權(quán)限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//code==100 是相機(jī)的權(quán)限 && code==200相冊(cè)的權(quán)限
if (requestCode==100){
openCamera();
}else if (requestCode == 200){
openAlbum(); //打開相冊(cè)方法
}
}
}
//打開相冊(cè)方法
private void openAlbum() {
//啟動(dòng)相冊(cè)
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent,ALBUM_CODE);
}
//打開相機(jī)
private void openCamera() {
//創(chuàng)建文件用于保存圖片
mFile = new File(getExternalCacheDir(), System.currentTimeMillis() + ".jpg");
if (!mFile.exists()) {
try {
mFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//適配7.0, 等到對(duì)應(yīng)的mImageUri路徑地址
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
mImageUri = Uri.fromFile(mFile);
} else {
//第二個(gè)參數(shù)要和清單文件中的配置保持一致 看面的清單文件 配置
mImageUri = FileProvider.getUriForFile(this, "com.baidu.upload.provider", mFile);
}
//啟動(dòng)相機(jī)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);//將拍照?qǐng)D片存入mImageUri
startActivityForResult(intent, CAMERA_CODE);
}
//intent 回調(diào)的結(jié)果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){//判斷回調(diào)成功
if (requestCode == CAMERA_CODE){//拍照
//顯示拍照后的圖片
/*try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mImageUri));
img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
//拍照后的圖片上傳
uploadFile(mFile);
}else if (requestCode == ALBUM_CODE) {//相冊(cè)
//獲取到相冊(cè)選中后的圖片URI路徑
Uri imageUri = data.getData();
//顯示相冊(cè)選中后的圖片
/*try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
//文件上傳,將Uri路徑轉(zhuǎn)換為File對(duì)象
//處理uri,7.0以后的fileProvider 把URI 以content provider 方式 對(duì)外提供的解析方法
File file = getFileFromUri(imageUri, this);
if (file.exists()){
uploadFile(file);
}
}
}
}
//版本問題 通過內(nèi)容提供者 轉(zhuǎn) 為 file文件
public File getFileFromUri(Uri uri, Context context) {
if (uri == null) {
return null;
}
switch (uri.getScheme()) {
case "content":
return getFileFromContentUri(uri, context);
case "file":
return new File(uri.getPath());
default:
return null;
}
}
/**
通過內(nèi)容解析中查詢uri中的文件路徑
*/
private File getFileFromContentUri(Uri contentUri, Context context) {
if (contentUri == null) {
return null;
}
File file = null;
String filePath;
String[] filePathColumn = {MediaStore.MediaColumns.DATA};
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(contentUri, filePathColumn, null,
null, null);
if (cursor != null) {
cursor.moveToFirst();
filePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0]));
cursor.close();
if (!TextUtils.isEmpty(filePath)) {
file = new File(filePath);
}
}
return file;
}
private void uploadFile(File mFile) {
String url = "http://yun918.cn/study/public/file_upload.php";
OkHttpClient client = new OkHttpClient.Builder()
.build();
//這里寫自己接口里需要的類型
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), mFile);
MultipartBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("key", "1996N")
.addFormDataPart("file", mFile.getName(), requestBody)
.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: "+e.getMessage() );
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
final UpLoadBean upLoadBean = gson.fromJson(string, UpLoadBean.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (upLoadBean!=null){
if (upLoadBean.getCode() == 200){
Toast.makeText(MainActivity.this,upLoadBean.getRes(),Toast.LENGTH_SHORT).show();
Glide.with(MainActivity.this).load(upLoadBean.getData().getUrl()).into(img);
Log.e(TAG, "run: "+upLoadBean.getData().getUrl() );
}else{
Toast.makeText(MainActivity.this,upLoadBean.getRes(),Toast.LENGTH_SHORT).show();
}
}
}
});
}
});
}