2017-05-01 8 views
-1

イメージをサーバーにアップロードしようとしているときに、次のエラーが表示されました.APIはヘッダ認証トークン_method = "put"とimage = "imageName.jpg"をパラメータとして受け取ります。どんな助けもありがとう。Retrofit multipartを使用して画像をアップロードする際にAndroidで問題が発生しましたか?

java.io.FileNotFoundException:/storage/emulated/0/Download/space-wallpaper-21.jpg:オープンに失敗しました:(パーミッション拒否)EACCES

userImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      galleryIntent.setType("*/*"); 
      startActivityForResult(galleryIntent, RESULT_LOAD_IMG); 
     } 
    }); 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) { 

     // Get the Image from data 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

     // Get the cursor 
     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     // Move to first row 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     imageDecodableString = cursor.getString(columnIndex); 
     cursor.close(); 

     StringBuilder stringBuilder = new StringBuilder(AUTHORIZATION); 

     sharedPreferences = this.getSharedPreferences(getResources().getString(R.string.token), 0); 
     stringBuilder.append(sharedPreferences.getString(getResources().getString(R.string.token), "")); 

     methodMap.put("_method", "PUT"); 

     File file = new File(imageDecodableString); 
     RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file); 
     MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody); 
     //RequestBody name = RequestBody.create(MediaType.parse("text/plain"), "image"); 

     Call<UserInfo> uploadImage = new RestClient(CONSTS.BASE_URL_ADDRESS_ACCOUNT_CREATION).getUserSignUpClient() 
       .postImage(stringBuilder.toString(), methodMap, body); 

     uploadImage.enqueue(new Callback<UserInfo>() { 
      @Override 
      public void onResponse(Call<UserInfo> call, Response<UserInfo> response) { 

       if (response.isSuccessful()) { 

       } 

      } 

      @Override 
      public void onFailure(Call<UserInfo> call, Throwable t) { 

       Toast.makeText(DetailActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show(); 

      } 
     }); 
    } 

インターフェース:

public interface UserSignUpClient { 

@POST("account") 
Call<AuthenticationAccountCreationResponse> createAccount(@Body UserSignUp userSignUp); 

@Multipart 
@POST("account") 
Call<UserInfo> postImage(@Header("Authorization") String headerValue, @PartMap Map<String, String> map, @Part MultipartBody.Part image); 
} 

改修ビルダークラス:

public class RestClient { 

private UserSignInClient userSignInClient; 
private UserSignUpClient userSignUpClient; 
private UserInfoClient userInfoClient; 
private UserImageUploadClient userImageUploadClient; 

public RestClient(String baseUrlLink){ 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(baseUrlLink) 
      .addConverterFactory(GsonConverterFactory.create()).build(); 

    if (baseUrlLink.equals(CONSTS.BASE_URL_ADDRESS_TOKEN)){ 

     userSignInClient = retrofit.create(UserSignInClient.class); 
    } else if (baseUrlLink.equals(CONSTS.BASE_URL_ADDRESS_ACCOUNT_CREATION)) { 

     userSignUpClient = retrofit.create(UserSignUpClient.class); 
    } else if (baseUrlLink.equals(CONSTS.BASE_URL_ADDRESS_USER_INFO)){ 

     userInfoClient = retrofit.create(UserInfoClient.class); 
    } 
} 

public UserSignInClient getUserSignInClient() { 
    return userSignInClient; 
} 

public UserSignUpClient getUserSignUpClient() { 
    return userSignUpClient; 
} 

public UserInfoClient getUserInfoClient() { 
    return userInfoClient; 
} 
} 
+0

マニフェストにWRITE_EXTERNAL_STORAGEの許可を追加することがありますか? – Avi

+0

はい、今追加しましたが、私はまだ同じエラーが発生しています。 – Athelon

答えて

3

は、しかし確かにそのアプリケーションタグの外にマニフェストfile.Makesのマニフェストタグ内でこの

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

を追加します。

がマニフェストに権限を追加します:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

デバイスのマシュマロの場合、上:アンドロイド6.0マシュマロ下

+0

はい私は今それを追加しましたが、私はまだ失敗throwableで同じエラーを取得しています。 – Athelon

+1

Marshmellow以上を使用している場合は、実行時に権限を要求する必要があります。あなたはそれについてもっと赤くすることができます(https://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gracefully-handle-permission-removal) –

+0

あなたの指導に感謝し、それは働いた – Athelon

2

について

public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ 

    private static final int REQUEST_WRITE_PERMISSION = 786; 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {    
     openFilePicker();//do your job 
    } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    requestPermission(); 
    } 

    private void requestPermission() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION); 
    } else { 
     openFilePicker();//do your job 
    } 
    } 
} 

詳細情報については、リンクの

下記参照

Android 6.0 Marshmallow. Cannot write to SD Card

Read and Write permission for storage and gallery usage for marshmallow

注:マニフェストファイルにアクセス権を追加することを忘れないでください

関連する問題